【问题标题】:Force template method in non-template class在非模板类中强制模板方法
【发布时间】:2014-03-02 19:45:24
【问题描述】:

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

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) 中,我尝试实现的行为是不可能的。除此之外,我真的应该重新编码这部分以避免这个问题。但是我接受给出的唯一答案,谢谢你的付出。

【问题讨论】:

  • 如何强制非模板类/结构覆盖模板方法?您可能想使用static type check。
  • 首先,:%s/how/why/g 你想解决什么问题?虚拟和模板 成员 不能混合(您已经发现)。我同意@πάνταῥεῖ。也许特征模型更适合您的最终目标。
  • @WhozCraig 我仍在寻找一篇论文的(过时的)链接,该链接显示了一种简洁的方式,即如何为 c++11 之前的标准设置概念检查。我基于此建立了一个小概念检查框架,可能我应该将其发布为 github gist 或项目。我目前不太熟悉 c++11 标准 type support library 朝这个方向发展的可能性。
  • 如果可以的话,我会将它标记为与我刚刚在相关菜单上找到的这个重复:how-to-design-around-the-limitation-that-templated-member-functions-cant-be-vir。 Double Dispatch 或全局函数是解决此问题的方法,但我并没有对我真正想要的(简单)用法失去希望。
  • @Serthy 是的,这也可以回答你的问题,只要你坚持需要纯虚函数。

标签: c++ templates overriding virtual


【解决方案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&lt;CheckedClass&gt;(); 函数的调用将被完全优化掉,并且不会对运行时性能产生任何影响。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 2016-08-17
    相关资源
    最近更新 更多