通用成员函数定义

时间:2019-07-10 10:32:52

标签: c++ templates c++17 member-functions

有没有办法在C ++中实现类似的目的?

template<typename SomeClass>
auto SomeClass::someMemberFunction() { ... }

这样的想法是,如果给定的成员函数在类中声明但未定义,则它将从此模板获取默认定义。

2 个答案:

答案 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
};