可能重复:
Program to implement the is_same_type type trait in c++模板函数可以比较两个类型名称吗?
我想我的模板功能不同的基础上做一些事情两个typenames是否相等或不:
template <typename T1, typename T2> f()
{
if (T1==T2) ...;
else ...;
}
我知道。“如果(T1 == T2)“不会工作,但是,有没有办法做到这一点?
可能重复:
Program to implement the is_same_type type trait in c++模板函数可以比较两个类型名称吗?
我想我的模板功能不同的基础上做一些事情两个typenames是否相等或不:
template <typename T1, typename T2> f()
{
if (T1==T2) ...;
else ...;
}
我知道。“如果(T1 == T2)“不会工作,但是,有没有办法做到这一点?
专营模板
template<typename T1, typename T2>
void f()
{
//The else part goes here
}
template<typename T>
void f()
{
//The if part goes here
}
downvoter想详细说明什么是错的? – StoryTeller
对于第二个,你不意味着只是模板
@SplinterOfChaos,我确实...有证明再读一次 – StoryTeller
您可以检查在C++ 11的boost::is_same
或std::is_same
。
所以,这将是这样的:
template <typename T1, typename T2> f()
{
if (boost::is_same<T1,T2>::value) ...;
else ...;
}
您决定使用'boost'而不是这两者之间的区别? – 0x499602D2
不是。我更加熟悉boost,因为它早在C++ 11之前就已经工作了。 – CygnusX1
如果类型可以推断,并没有被明确地过去了,你也可以创建两个单独的函数:
template<typename SameType>
void f(SameType x, SameType y)
{
// ...
}
template<typename T1, typename T2>
void f(T1 x, T2 y)
{
// ...
}
您可以比较的T1
的typeid
和T2
#include <typeinfo>
template <typename T1, typename T2> void f()
{
bool a;
if (typeid(T1) == typeid(T2))
a = true;
else
a = false;
}
虽然它也是一种解决方案,但请注意,typeid在运行时解析。它引入了性能开销,两个分支都将出现在函数中。我相信这种情况的编译时评估是首选。 – CygnusX1
由于它们的typeid是相等的,所以对于f
#include <type_traits>
template <typename A, typename B> void f() {
if (std::is_same<A, B>::value) {
//
}
}
std::is_same
取决于类型的equlity A
和B
http://en.cppreference.com/w/cpp/types/is_same – SplinterOfChaos
@返回布尔值的
typedef
(真,假) NPE这不是一个重复的恕我直言。正确应用'is_same'与实施它不同。如果他会做'T2 t; T1 * u =&t;'在真正的分支?如果他分别对'char'和'int'类型使用上面的'if',编译将会失败。 –@ JohannesSchaub-litb:你说得对。无法撤消投票,但会在今天余下时间停止投票。 :) – NPE