提问者:小点点

绑定派生类中的非静态模板成员函数


#include <functional>
#include <iostream>

class Plain {
   public:
    template <typename Type>
    void member_function(const Type& s) {
        std::cout << "Recived: " << s << std::endl;
    }
};

template <typename Type>
class Templated : private Plain {
   public:
};

int main() {
    Plain b;
    b.member_function<int>(10); // done!
    Templated<int> d;
    // d.member_function();  /* how to achive this */

    return 0;
}

我试图通过两个方法调用类纯中的成员函数:

  1. 在调用函数时创建非模板类和填充类型
Plain p;
p.member_function<int>();
Templated<int> t;
t.member_function(); // achive this

我尝试在派生类中绑定函数,比如

struct Plain{
    template<typename T>
    static void member_function(const T& s){std::cout << s << std::endl;}
}

template<typename T>
struct Templated : private Plain {
    std::function<void(const T&)> print = Templated::Plain::member_function;
}

从那以后我就可以

Templated t<std::string>;
t.print();

共1个答案

匿名用户

当您使用私有继承时,外部代码无法访问Plain中的方法,并且您需要在模板化的内部有一些东西来调用Plain中的方法; 您可以这样做,或者您可以使用公共继承并能够直接命中它。

class Plain {
public:
    template <typename T>
    void print(const T & s) {
        std::cout << "Received: " << s << std::endl;
    }
};

template <typename T>
class Templated : private Plain {
public:
    void print(const T & s) {
        Plain::print<T>(s);
    }
};

template <typename T>
class Alternative : public Plain {};

int main() {
    Templated<int> t;
    t.print(3); // This could work

    Alternative<int> a;
    a.print(4); // As could this

    return 0;
}