Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.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++_Template Specialization_Template Meta Programming_Compile Time_Static Assert - Fatal编程技术网

C++ 用于检测模板专门化的模板元函数

C++ 用于检测模板专门化的模板元函数,c++,template-specialization,template-meta-programming,compile-time,static-assert,C++,Template Specialization,Template Meta Programming,Compile Time,Static Assert,受此启发,我想知道是否可以引入一些编译时检查来检测两个给定的模板实例化: template <typename T> class Templ... typedef Templ<std::string> stringInstance; typedef Templ<double> doubleInstance; 有可能创造这种元功能吗?老实说,这似乎不太可能(尽管我不能肯定地排除狡猾的伎俩) 给定的专门化(在选择它的类型参数之外)没有第一类标识可供比较 因此,

受此启发,我想知道是否可以引入一些编译时检查来检测两个给定的模板实例化:

template <typename T>
class Templ...

typedef Templ<std::string> stringInstance;
typedef Templ<double> doubleInstance;

有可能创造这种元功能吗?

老实说,这似乎不太可能(尽管我不能肯定地排除狡猾的伎俩)

给定的专门化(在选择它的类型参数之外)没有第一类标识可供比较

因此,如果需要,您可以使用自己的模板,但不能为现有模板编写特殊推理


还要考虑到它无论如何都不起作用,因为它无法判断两个实例化是否具有兼容的布局:即使
temp
temp
是从同一个模板代码实例化的,没有专门化,该代码也可以使用专门化的traits类。

我喜欢这个问题,但我很想知道这样一个设施的应用程序可能是什么,如果可能的话。@Component10,看看链接的问题;这将检测这样的投射是否安全。只要参数typeUnderstand的const限定不存在专门化,则强制转换是安全的-我可以看出这是多么有用。@lurscher实际上这样做是不安全的,因为该类可能包含另一个专门用于
const
类型的模板类的实例,不是吗?我怀疑问题是你在对图灵完备语言进行相对简单的推理,而没有考虑它的图灵完备性<由于C++中的模板有多强大,所以NothytoSySeMyTeMPLML定义不会推断出任何有用的东西。所以,我仍然在试图找出一种方法来确保我的角色是安全的…使用编译时断言似乎是不可能的then@lurscher我认为不可能确保强制转换对于任意模板是安全的。你必须制作一个新的
向量
,并将元素移动/复制到其中。我知道,你可能是对的,但如果std:vector能用std::vector&as_vector_of_consts()来支持这一点,那就太浪费了。我同意,但我认为解决方案是将
向量
向量常量&
(和适当的常量迭代器等)而不是
vector
vector
template <typename T>
class Templ
{}

template <>
class Templ<std::string>
{}

template <>
class Templ<double>
{}

template <typename T1,typename T2>
class Belong_To_Same_Templ_Definition
{}

//tests
typedef Templ<std::string> stringInstance;
typedef Templ<double> doubleInstance;
typedef Templ<int> intInstance;
typedef Templ<char> charInstance;

assert( Belong_To_Same_Templ_Definition< intInstance , charInstance >::value == true);
assert( Belong_To_Same_Templ_Definition< intInstance , doubleInstance >::value == false);
assert( Belong_To_Same_Templ_Definition< stringInstance , doubleInstance >::value == false);