非模板类中的强制模板方法

时间:2014-03-02 19:45:25

标签: c++ templates override virtual

我尝试实现此类的以下行为/语法/用法:

Data1 dataType1;
Data2 dataType2;

int intType;
float floatType;

dataType1.method( intType );
dataType1.method( floatType );

dataType2.method( intType );
dataType2.method( floatType );

我的方法是:

struct CDataBase
{
    template< typename T > virtual void method( T type ) = 0;
};

struct CData1 : CDataBase
{
    template< typename T > void method( T type ) {}
};

struct CData2 : CDataBase
{
    template< typename T > void method( T type ) {}
};

但是虚拟模板方法是不可能的。此外,不需要实际的基类,但我必须确保某些类实现了(模板)'方法()'。

如何强制非模板化的类/结构覆盖模板方法?


编辑: 这是我的实际布局:

struct Data0
{
    int someVar;

    template< class T >
    void decode( T& type )
    {
        type.set( someVar );
    }
};

编辑: 在当前版本的C ++(11)中,我尝试实现的行为是不可能的。除此之外,我应该重新编写这部分以避免这个问题。但是我接受了给出的唯一答案,谢谢你的支持。

1 个答案:

答案 0 :(得分:1)

检查给定模板参数类型实现的特定函数的基本思想是尝试实例化这些函数指针。如果无法解析函数指针初始化,编译器会抱怨。

以下是一些示例代码来说明原理:

template<typename T>
void check_has_foo_function() {
    void (T::*check)(int, double) = &T::foo;
    (void)check;
}

struct A {
    void foo(int, double) {};
};

struct B {
    void bar(int, double) {};
};

template<typename CheckedClass>
struct Client {
    void doSomething() {
        check_has_foo_function<CheckedClass>();
        CheckedClass x;
        x.foo(5,3.1415);
    }
};

int main() {

    Client<A> clientA;
    clientA.doSomething();

    // Uncomment the following lines to see the compilation fails
    // Client<B> clientB;
    // clientB.doSomething();
    return 0;
}

请注意,对check_has_foo_function<CheckedClass>();函数的调用将完全优化,对运行时性能没有任何影响。

基于此,可以提供进一步的抽象(例如,使用预处理器宏生成检查)。我在GitHub上发布了一个使用这些技术的little experimental framework