Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++;模板元编程静态类型检查_C++_Templates_Template Specialization - Fatal编程技术网

C++ C++;模板元编程静态类型检查

C++ C++;模板元编程静态类型检查,c++,templates,template-specialization,C++,Templates,Template Specialization,我找不到问题的答案,所以我把它作为一个问题发布。我举一个小的虚拟示例来解释它: enum STORAGE_TYPE { CONTIGUOUS, NON_CONTIGUOUS }; template <typename T, STORAGE_TYPE type=CONTIGUOUS> class Data { public: void a() { return 1; } }; // partial type specialization te

我找不到问题的答案,所以我把它作为一个问题发布。我举一个小的虚拟示例来解释它:

enum STORAGE_TYPE
{
    CONTIGUOUS,
    NON_CONTIGUOUS
};

template <typename T, STORAGE_TYPE type=CONTIGUOUS>
class Data
{
    public:
        void a() { return 1; }
};

// partial type specialization
template <typename T>
class Data<T, NON_CONTIGUOUS>
{
    public:
        void b() { return 0; }
};

// this method should accept any Data including specializations…
template <typename T, STORAGE_TYPE type>
void func(Data<T, type> &d)
{
    /* How could I determine statically the STORAGE_TYPE? */
    #if .. ?? 
        d.a();
    #else
        d.b();
    #endif      
}


int main()
{
    Data<int> d1;
    Data<int, NON_CONTIGUOUS> d2;

    func(d1);
    func(d2);

    return 0;
}
enum存储类型
{
毗连,
非连续
};
模板
类数据
{
公众:
void a(){return 1;}
};
//部分类型专门化
模板
类数据
{
公众:
void b(){return 0;}
};
//此方法应接受任何数据,包括专门化…
模板
作废职能(数据与开发)
{
/*如何静态确定存储类型*/
#如果??
d、 a();
#否则
d、 b();
#恩迪夫
}
int main()
{
数据d1;
数据d2;
func(d1);
func(d2);
返回0;
}
请注意 (1) 我不想要“func”的专门化,因为这可以解决问题,但我只想要一个带有内部静态“if”条件的泛型方法“func”来执行代码。
<强>(2)< /强>,我更喜欢用标准C++(不C++ +0x或Boost)的解决方案。

< P>键是SFinae。您必须声明一个以存储类型为模板的helper类,并为其中一个提供definitionodefinitional。这样,如果存在专门化,则您在编译时知道您拥有的存储类型(您提供了定义的存储类型),如果替换失败(这不是错误,SFINAE),则属于另一种情况。

使用:

模板
结构数据特征{
静态无效调用函数(数据和数据)
{
d、 a();
}
};
模板
结构数据特征{
静态无效调用函数(数据和数据)
{
d、 b();
}
};
//此方法应接受任何数据,包括专门化…
模板
作废职能(数据与开发)
{
/*如何静态确定存储类型*/
DataTraits::callFunction(d);
}

C++0x(现在的C++11)是当前的标准。我认为func专门化是最好的解决方案(最容易阅读),但由于名为type的模板参数是一个值而不是一个类型,您不能在if测试中仅将type用作右值吗?显而易见的解决方案是为通过(静态)调用的成员函数赋予相同的名称多态性。@Ubiquité真正的问题是,如果没有专门化或重载,对
a()
b()
的调用总是无效的。谢谢,但我在“数据”中有几十个方法(有些重叠,有些完全不同),所以不能包装所有的可能性。我在考虑“typedef”的用法,但不知道如何让它实际工作。你可以输入
DataTraits
任何你想要的,甚至几十种方法。在STD C++库中使用标签调度特性,它们似乎覆盖了非常不同类型之间的所有差异。给你关于数据中完全不同的元素的问题添加一些例子,也许我能帮你。
template <typename T, STORAGE_TYPE type>
struct DataTraits {
  static void callFunction(Data<T, type> &d)
  {
    d.a();
  }
};

template <typename T>
struct DataTraits<T,NON_CONTIGUOUS> {
  static void callFunction(Data<T, NON_CONTIGUOUS> &d)
  {
    d.b();
  }
};


// this method should accept any Data including specializations…
template <typename T, STORAGE_TYPE type>
void func(Data<T, type> &d)
{
    /* How could I determine statically the STORAGE_TYPE? */
    DataTraits<T,type>::callFunction(d);
}