2012-11-30 61 views
4

可能重复:
Program to implement the is_same_type type trait in c++模板函数可以比较两个类型名称吗?

我想我的模板功能不同的基础上做一些事情两个typenames是否相等或不:

template <typename T1, typename T2> f() 
{ 
    if (T1==T2) ...; 
    else ...; 
} 

我知道。“如果(T1 == T2)“不会工作,但是,有没有办法做到这一点?

+1

http://en.cppreference.com/w/cpp/types/is_same – SplinterOfChaos

+1

@返回布尔值的typedef(真,假) NPE这不是一个重复的恕我直言。正确应用'is_same'与实施它不同。如果他会做'T2 t; T1 * u =&t;'在真正的分支?如果他分别对'char'和'int'类型使用上面的'if',编译将会失败。 –

+0

@ JohannesSchaub-litb:你说得对。无法撤消投票,但会在今天余下时间停止投票。 :) – NPE

回答

1

专营模板

template<typename T1, typename T2> 
void f() 
{ 
    //The else part goes here 
} 

template<typename T> 
void f() 
{ 
    //The if part goes here 
} 
+0

downvoter想详细说明什么是错的? – StoryTeller

+0

对于第二个,你不意味着只是模板?您刚发布的版本不能编译。 – SplinterOfChaos

+0

@SplinterOfChaos,我确实...有证明再读一次 – StoryTeller

8

您可以检查在C++ 11的boost::is_samestd::is_same

所以,这将是这样的:

template <typename T1, typename T2> f() 
{ 
    if (boost::is_same<T1,T2>::value) ...; 
    else ...; 
} 
+0

您决定使用'boost'而不是这两者之间的区别? – 0x499602D2

+0

不是。我更加熟悉boost,因为它早在C++ 11之前就已经工作了。 – CygnusX1

3

如果类型可以推断,并没有被明确地过去了,你也可以创建两个单独的函数:

template<typename SameType> 
void f(SameType x, SameType y) 
{ 
    // ... 
} 

template<typename T1, typename T2> 
void f(T1 x, T2 y) 
{ 
    // ... 
} 
0

您可以比较的T1typeidT2

#include <typeinfo> 

template <typename T1, typename T2> void f() 
{ 
    bool a; 
    if (typeid(T1) == typeid(T2)) 
     a = true; 
    else 
     a = false; 
} 
+1

虽然它也是一种解决方案,但请注意,typeid在运行时解析。它引入了性能开销,两个分支都将出现在函数中。我相信这种情况的编译时评估是首选。 – CygnusX1

+2

由于它们的typeid是相等的,所以对于f 或f 不起作用。 –

0
#include <type_traits> 

template <typename A, typename B> void f() { 

    if (std::is_same<A, B>::value) { 

     // 

    } 

} 

std::is_same取决于类型的equlity AB