如何为非类型模板声明指向对象的指针?

时间:2018-09-18 18:54:21

标签: c++ templates non-type

请考虑以下示例:

template <int N, int M>
class MyClass {
    private:
       void myFunc(void);

    public:
        void callMe(void);

    };

我需要声明一个指向此类对象的通用指针。编译器拒绝以下语句。我究竟做错了什么?感谢您的帮助。

extern template<int N, int M> MyClass<N, M> *obj;

为什么我要这样做?我需要编写一个能够处理此类中对象的通用实例的函数,请参见示例:

inline template <int N, int M> void MyClass<N,M>::MyFunc(void) { obj = this; };

如果可能的话,这是我想要的行为。 请注意,它可以与NON TEMPLATE类型完美配合。

void ThisIsAnotherFunction(void) {
    obj->callMe();
}

3 个答案:

答案 0 :(得分:3)

您的不同模板类将没有共同之处。您可以做的是让您的模板化类共享一个公共基类,如下所示:

struct BaseClass {};

template <int N, int M>
class MyClass : BaseClass {
    /*stuff*/
};

extern BaseClass* obj;

如果要使用指向特定具体类型的指针,则别无选择,只能在声明中提供N和M的值。

extern MyClass<2, 3>* obj2;

答案 1 :(得分:0)

您的问题至少允许两种解释...

I)...您想要运行时多态性

同一模板的不同实例是完全不相关的类型。如果希望它们共享一个公共接口,则可以使用一个公共基类:

struct base {
    /* declare common interface here */
};

template <int N, int M> struct foo : base {};

II)...您想要每个临时模板实例的变量obj

这闻起来像单身,我不确定这样做是否有意义,但那会是这样的:

template <int N,int M> struct foo {
    constexpr static const foo* obj = new foo();    
};

答案 2 :(得分:0)

For the records, I resolved by using the suggestion wrote by #user463035818 (thanks dude!). I created a base class with callMe as virtual function (refer to initial example). Thanks to all that provided their support. Hope to retribute soon.