通用成员函数定义
Generic member functions definition
有没有办法在 C++ 中实现类似的东西:
template<typename SomeClass>
auto SomeClass::someMemberFunction() { ... }
想法是,如果给定的成员函数在 class 中声明但未定义,它将从此模板中获取默认定义。
您可以简单地添加一个通用基础 class,如下所示:
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();
}
如果您愿意,可以将基础 class 作为参数添加到您的模板中,使其部分成为 CRTP。真正的 CRTP 也转换为派生 class,这不是您问题的一部分,但如果您愿意,可以添加它。
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();
}
据我所知,模板类型在这种情况下不起作用。您编写了模板函数的定义,但您需要声明。您可以将声明写成一个 body-one 部分,而不是一些 class 成员的声明,例如:
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++ 中实现类似的东西:
template<typename SomeClass>
auto SomeClass::someMemberFunction() { ... }
想法是,如果给定的成员函数在 class 中声明但未定义,它将从此模板中获取默认定义。
您可以简单地添加一个通用基础 class,如下所示:
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();
}
如果您愿意,可以将基础 class 作为参数添加到您的模板中,使其部分成为 CRTP。真正的 CRTP 也转换为派生 class,这不是您问题的一部分,但如果您愿意,可以添加它。
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();
}
据我所知,模板类型在这种情况下不起作用。您编写了模板函数的定义,但您需要声明。您可以将声明写成一个 body-one 部分,而不是一些 class 成员的声明,例如:
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;
}