有没有办法在C ++中实现类似的目的?
template<typename SomeClass>
auto SomeClass::someMemberFunction() { ... }
这样的想法是,如果给定的成员函数在类中声明但未定义,则它将从此模板获取默认定义。
答案 0 :(得分:1)
您可以这样简单地添加一个通用基类:
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();
}
答案 1 :(得分:1)
据我所知,模板类型在这种情况下不起作用。您编写了模板函数的定义,但需要声明。您可以将声明作为一个整体的一部分来编写,而不是像这样的某些类成员来编写:
onclick="cancelLogout();"
解决方案是继承,但是这里不需要模板:
class A {
//some members
};
class A { //redefinition, not possible "partial class" like in C#
//the other members
};