Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.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++中检查传递给模板函数的类型?例如: template <typename T> void Foo() { if (typeof(SomeClass) == T) ...; else if (typeof(SomeClass2) == T) ...; } #include <boost/type_traits/is_same.hpp> template <typename T> void Foo () { if ((boost::is_same<T, SomeClass>::value)) ...; else if ((boost::is_same<T, SomeClass2>::value)) ...; } 模板 void Foo() { if(typeof(SomeClass)==T) ...; else if(typeof(SomeClass2)==T) ...; }_C++_Templates_Types - Fatal编程技术网

从模板中切换传递的类型 是否可以在C++中检查传递给模板函数的类型?例如: template <typename T> void Foo() { if (typeof(SomeClass) == T) ...; else if (typeof(SomeClass2) == T) ...; } #include <boost/type_traits/is_same.hpp> template <typename T> void Foo () { if ((boost::is_same<T, SomeClass>::value)) ...; else if ((boost::is_same<T, SomeClass2>::value)) ...; } 模板 void Foo() { if(typeof(SomeClass)==T) ...; else if(typeof(SomeClass2)==T) ...; }

从模板中切换传递的类型 是否可以在C++中检查传递给模板函数的类型?例如: template <typename T> void Foo() { if (typeof(SomeClass) == T) ...; else if (typeof(SomeClass2) == T) ...; } #include <boost/type_traits/is_same.hpp> template <typename T> void Foo () { if ((boost::is_same<T, SomeClass>::value)) ...; else if ((boost::is_same<T, SomeClass2>::value)) ...; } 模板 void Foo() { if(typeof(SomeClass)==T) ...; else if(typeof(SomeClass2)==T) ...; },c++,templates,types,C++,Templates,Types,如果要根据类型执行特定操作,请专门化模板: template <typename T> void Foo() { } template <> void Foo<SomeClass>() { } template <> void Foo<SomeClass2>() { } // etc. 模板 void Foo(){} 模板 void Foo(){} 模板 void Foo(){} //等等。 (不过,您实际上并不想专门化函数

如果要根据类型执行特定操作,请专门化模板:

template <typename T>
void Foo() { }

template <>
void Foo<SomeClass>() { }

template <> 
void Foo<SomeClass2>() { }

// etc.
模板
void Foo(){}
模板
void Foo(){}
模板
void Foo(){}
//等等。
(不过,您实际上并不想专门化函数模板;这只是为了说明。如果可以的话,您可以重载模板,或者委托给专门化的类模板。有关为什么以及如何避免专门化函数模板的更多信息,请阅读Herb Sutter的)

是。你将不得不使用。例如:

template <typename T>
void Foo()
{
   if (typeof(SomeClass) == T)
      ...;
   else if (typeof(SomeClass2) == T)
      ...;
}
#include <boost/type_traits/is_same.hpp>

template <typename T>
void Foo ()
{
   if ((boost::is_same<T, SomeClass>::value))
      ...;
   else if ((boost::is_same<T, SomeClass2>::value))
      ...;
}
#包括
模板
void Foo()
{
if((boost::is_same::value))
...;
如果((boost::is_same::value))
...;
}
根据您试图实现的目标,使用可能是更好的选择


此外,还可以使用有条件地启用/禁用某些函数/方法。例如,将其与类型特征相结合将允许对一组类型使用一个函数,对另一组类型使用另一个函数。

否,但是您可以使用部分专门化:

template<typename T>
struct Bar { static void foo(); };
template<typename T>
template<> inline void Bar<T>::foo() {
//generic
}
template<> inline void Bar<int>::foo() {
//stuff for int
}
template<> inline void Bar<QString>::foo() {
//QString
}
模板
结构条{static void foo();};
模板
模板内联空栏::foo(){
//一般的
}
模板内联空栏::foo(){
//整型的东西
}
模板内联空栏::foo(){
//QString
}
编辑是的,带有类型特征,但实际上并不需要。 编辑2键入示例

#include <type_traits>
template<typename T> void foo() {
    using std::is_same;
    if<is_same<T, T2>::value || is_same<T, T1>::value) { 
        /* stuff */
    }
}
#包括
模板void foo(){
使用std::是相同的;

如果是的,它是……但是它可能不会像你期望的那样工作

template < typename T >
void foo()
{
  if (is_same<T,SomeClass>::value) ...;
  else if (is_same<T,SomeClass2>::value) ...;
}

请注意,在这里您不会遭受任何运行时多态性开销,并且在启用优化后,它将导致相同或更小的代码大小和速度(尽管在运行探查器之前,您不应该担心这一点)。

如果我想做类似于
if(is|same | is|same)的事情,该怎么办
?如果编译器支持C++0x(VS2010/任何最新的gcc),则必须使用类型特征
#include和std::is_same::value
或者只使用boost实现旧编译器兼容性。这不是部分专门化,而是完全专门化。这有一个非常显著的区别。可能最重要的是,不可能以这种方式进行部分专门化,因为任何类型的函数都不允许使用这种方式。您的代码将无法编译。您需要安装声明该实例化与变量相同,或者您需要访问其内部的
定义。@Noah:对。这是一个快速而肮脏的提示:-)我已经修改了它。是否可以对一组值执行此操作?例如,对每个枚举值执行其他操作?@paulm:我不明白为什么不能根据版本返回不同的类型n_标记?当然可以。如果您卡在C++03中,或者在C++11及更高版本中使用auto,您需要想出一些方法来查询信息。只要您不尝试在同一个实例化中返回不同的类型,您就不会有问题。现在使用C++17,您可以使用constexpr if语句来轻松地执行此操作