泛型成员函数定义

Generic member functions definition

本文关键字:定义 函数 成员 泛型      更新时间:2023-10-16

有没有办法在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();
}

据我所知,模板类型在这种情况下不起作用。您编写了模板函数的定义,但需要声明。声明你可以写成一个主体-一个部分,而不是一些类成员,如:

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