【问题标题】:Can a template function compare the two typenames? [duplicate]模板函数可以比较两个类型名吗? [复制]
【发布时间】:2012-11-30 22:49:11
【问题描述】:

可能重复:
Program to implement the is_same_type type trait in c++

我希望我的模板函数根据两个类型名是否相等来做不同的事情:

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

我知道“if(T1==T2)”行不通,但是,有没有办法做到这一点?

【问题讨论】:

  • @NPE 这不是重复的恕我直言。正确应用is_same 不同于仅仅实现它。如果他将在真正的分支中做T2 t; T1 *u = &amp;t; 怎么办?如果他分别将if 用于char 和int 类型,编译将失败。
  • @JohannesSchaub-litb:你是对的。无法撤消投票,但将在当天剩余时间停止投票。 :)

标签: c++


【解决方案1】:

您可以在 C++11 中查看boost::is_same 或std::is_same。

所以,应该是这样的:

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

【讨论】:

  • 您决定改用boost 的这两者之间有区别吗?
  • 并非如此。我只是更熟悉 boost,因为它早在 C++11 之前就已经工作了。
【解决方案2】:
#include <type_traits>

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

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

        //

    }

}

std::is_same 根据A 和B 类型的相等性返回一个布尔值(true, false)的typedef

【讨论】:

    【解决方案3】:

    如果可以推断类型并且没有显式传递,则可以创建两个单独的函数:

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

    【讨论】:

      【解决方案4】:

      专门化模板

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

      【讨论】:

      • downvoter 想详细说明问题出在哪里?
      • 第二个,你不是说模板吗?你刚刚发布的版本没有编译。
      • @SplinterOfChaos,我愿意...应该再校对一遍
      • 不是特化,是重载。
      【解决方案5】:

      你可以比较T1和T2的typeid

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

      【讨论】:

      • 虽然它也是一种解决方案,但请注意 typeid 是在运行时解析的。它引入了性能开销,并且两个分支都将出现在函数中。我相信条件的编译时评估是首选。
      • 它不适用于f&lt;int, const int&gt; 或f&lt;const int&amp;, int&amp;&amp;&gt;,因为它们的typeid 都是相同的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 2012-09-07
      • 2020-08-09
      • 2018-04-03
      • 1970-01-01
      • 2020-07-20
      • 2012-01-30
      相关资源
      最近更新 更多