c++ - 通用成员函数定义

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

有没有办法在 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/

相关文章:

c++ - 使用构造函数初始化结构或之后设置其值是否更好?

c++ - C++ switch语句-在情况之间跳转

c++ - 停靠区分隔符的Qt样式表

c++ - 从继承类 C++ 获取模板类型

c++ - 许多嵌套 std::conditional_t 的替代品?

c++ - 可变参数构造函数是否应该隐藏隐式生成的构造函数?

c++ - 具有部分特化的类模板参数推导

c++ - Qt音乐播放器: mini player mode

c++ - 使用已定义的结构作为 union 的匿名成员

c++ - 针对简单 if..else 语句的递归 Variadic 函数调用的性能