泛型成员函数定义
Generic member functions definition
有没有办法在C++中实现类似的事情:
template<typename SomeClass>
auto SomeClass::someMemberFunction() { ... }
这个想法是,如果给定的成员函数在类中声明但未定义,它将从此模板中获取默认定义。
您可以简单地添加一个通用基类,如下所示:
class DefaultsAsBase
{
public:
void Bla() { std::cout << "Bla" << std::endl; }
void Blub() { std::cout << "Blub" << std::endl; }
};
template < typename T>
class TemplatedOnes: public DefaultsAsBase
{
public:
void Bla() { std::cout << "templated Bla" << std::endl; }
};
// and the specialized if needed
template <>
class TemplatedOnes<int>: public DefaultsAsBase
{
public:
void Blub() { std::cout << "Specialized Blub" << std::endl; }
};
int main()
{
TemplatedOnes<float> tf;
TemplatedOnes<int> ti;
tf.Bla();
tf.Blub();
ti.Bla();
ti.Blub();
}
如果您愿意,可以将基类作为参数添加到模板中,这使其部分为 CRTP。真正的 CRTP 也有强制转换为派生类,这不是您问题的一部分,但如果您愿意,您可以添加它。
class DefaultsAsBase
{
public:
void Bla() { std::cout << "Bla" << std::endl; }
void Blub() { std::cout << "Blub" << std::endl; }
};
class OtherDefaultAsBase
{
void Bla() { std::cout << "Bla other" << std::endl; }
void Blub() { std::cout << "Blub other" << std::endl; }
};
template < typename T, class CRTP_BASE>
class TemplatedOnes: public CRTP_BASE
{
public:
void Bla() { std::cout << "templated Bla" << std::endl; }
};
// and the specialized if needed
template <typename CRTP_BASE>
class TemplatedOnes<int, CRTP_BASE>: public DefaultsAsBase
{
public:
void Blub() { std::cout << "Specialized Blub" << std::endl; }
};
int main()
{
TemplatedOnes<float, DefaultsAsBase> tf;
TemplatedOnes<int, DefaultsAsBase> ti;
TemplatedOnes<int, OtherDefaultAsBase> ti2;
tf.Bla();
tf.Blub();
ti.Bla();
ti.Blub();
ti2.Bla();
ti2.Blub();
}
据我所知,模板类型在这种情况下不起作用。您编写了模板函数的定义,但需要声明。声明你可以写成一个主体-一个部分,而不是一些类成员,如:
class A {
//some members
};
class A { //redefinition, not possible "partial class" like in C#
//the other members
};
解决方案是继承,但这里你不需要模板:
#include <iostream>
using namespace std;
class Base{
protected:
Base(){}
public:
int someMemberFunction() {
return 5;
}
};
class A: public Base{
public:
int X(){
return x;
}
void setX(int _x){
x=_x;
}
private:
int x;
};
int main(){
A a;
a.setX(3);
//Base b; Base() is protected
cout <<"a.x="<<a.X()<<endl;
cout <<"a.someMemberFunction(): "<<a.someMemberFunction()<<endl;
return 0;
}
相关文章:
- 在命名空间中定义函数还是限定函数
- 为什么在定义函数之前先声明它
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- 这个c++代码是如何在没有定义函数的情况下运行的
- 具有外部"c"和程序集的未定义函数
- 已定义函数时出现 G++ "未定义的引用"错误
- 将自定义函数传递到基抽象类中以延迟执行
- C++使用 rand 定义函数语法
- Arduino:在 loop() 和自定义函数中运行相同的代码时出现问题
- 将具有固定签名的自定义函数名称注入 CRTP
- 使用定义函数模板别名
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- 在内联程序集中定义函数和从 C++ 调用时出现问题
- 在 Metal 着色器代码中,如何定义函数的 in/out 参数变量?
- 声明和定义函数静态会产生"undefined reference to function_name()"
- 朋友定义函数的名称空间是什么
- 介子 对用户定义函数的未定义引用
- 如何使用 "using" 关键字定义函数原型/签名
- 在 C 结构中定义C++函数