有没有办法在 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();
}
关于c++ - 通用成员函数定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56968829/