【问题标题】:Proper use of template when type interface is slightly different类型界面略有不同时模板的正确使用
【发布时间】:2020-08-15 10:52:31
【问题描述】:

我将有一个类函数来对两种可能的参数类型进行几乎完全相同的操作,比如 foo(TypeA * t) 和 foo(TypeB * t) 有两种场景:1)整个函数是等价的,两种类型的接口完全一样,我想我可以用一个模板定义:

模板 无效 foo(T * t)

2) 接口会略有不同,在函数中我们应该使用TypeA中的t->x代替TypeB中的t->y,其余的功能应该是等价的。有没有编写两个函数或函数规范的好/干净的方法?

谢谢!

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    你可以在 C++17 中使用if constexpr,所以它会是这样的:

    template<typename T>
    void foo(T * t)
    {
       if constexpr (std::is_same_v<std::remove_reference_t<T>, TypeA>)
          t->x();
       else
          t->y();
       // the rest of your function
    }
    

    或者,您可以简单地将不同的部分分解到另一个您为其创建 2 个模板特化的函数中。

    编辑:在这种特殊情况下,它可能只适用于std::is_same_v&lt;T, TypeA&gt;,因为您不能拥有指向引用的指针。但总的来说,最好像我上面那样添加std::decay_t&lt;T&gt;std::remove_reference_t&lt;T&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-22
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 2019-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多