Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 非模板类中的强制模板方法_C++_Templates_Overriding_Virtual - Fatal编程技术网

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

C++ 非模板类中的强制模板方法,c++,templates,overriding,virtual,C++,Templates,Overriding,Virtual,我尝试实现该类的以下行为/语法/用法: Data1 dataType1; Data2 dataType2; int intType; float floatType; dataType1.method( intType ); dataType1.method( floatType ); dataType2.method( intType ); dataType2.method( floatType ); 我的做法是: struct CDataBase { template<

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

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-CDataBase
{
模板虚空方法(T type)=0;
};
结构CDATA 1:CDATA基础
{
模板void方法(T类型){
};
结构CDATA 2:CDATA基础
{
模板void方法(T类型){
};
但是,虚拟模板方法是不可能的。此外,不需要实际的基类,但是我必须确保某些类实现了(模板)'method()'

如何强制非模板类/结构重写模板方法


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

struct Data0
{
    int someVar;

    template< class T >
    void decode( T& type )
    {
        type.set( someVar );
    }
};
结构数据0 { int-someVar; 模板 无效解码(T&type) { type.set(someVar); } }; 编辑:
在当前版本的C++(11)中,我试图实现的行为是不可能的。除此之外,我真的应该重新编码这部分以避免这个问题。但是,我接受给出的唯一答案,谢谢您的支持。

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

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

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;
}
模板
无效检查\u具有\u foo\u函数(){
void(T::*检查)(int,double)=&T::foo;
(作废)支票;
}
结构A{
voidfoo(int,double){};
};
结构B{
空条(int,double){};
};
模板
结构客户端{
无效剂量测定法(){
检查_是否具有_foo_函数();
检查x类;
x、 foo(5,3.1415);
}
};
int main(){

GitHub上使用这些技术的客户端。

如何强制非模板类/结构重写模板方法?您可能需要使用。首先,:%s/How/why/g您试图解决什么问题?虚拟成员和模板成员不会混合(您已经发现)。我同意@πάνταῥεῖ. 也许特质模型更适合你的最终目标。@WhozCraig我还在寻找(过时的)链接到一篇文章,展示了一种简洁的方法,如何为c++11之前的标准设置概念检查。我基于此建立了一个小小的概念检查框架,可能我应该将其发布为github gist或项目。我目前还不太熟悉该标准向这个方向发展的可能性。如果可以,我会将其标记为与此重复我刚刚在相关菜单上找到了一个:。双分派或全局函数是一个解决方案,但我并没有对我真正想要的(简单)使用失去希望。@Serthy是的,这也可以回答您的问题,只要您坚持需要纯虚拟函数。