【问题标题】:How to tell if two variables have the same type at compile time?如何在编译时判断两个变量是否具有相同的类型?
【发布时间】:2019-09-29 11:31:37
【问题描述】:

有没有比这更好的方法(或其他方法)来判断两个变量在编译时是否具有相同的类型:

auto var1 = ..;
auto var2 = ..;
static_assert(std::is_same<decltype(var1), decltype(var2)>::value);

【问题讨论】:

  • 您是要检查两个现有变量是否具有相同的类型,还是要将第二个变量声明为与第一个变量具有相同的类型?
  • @gerum 我认为问题的标题强烈暗示了第一个。 :)
  • 这有什么问题? (从::value 更改为std::is_same_v 除外)
  • 如果你想要一个“更好”的方式,你应该解释这种方式有什么问题。

标签: c++ c++17


【解决方案1】:

有没有更好的方法(或另一种方法)来判断两个变量是否有 编译时与此相同的类型:

嗯,你可以使用辅助变量模板std::is_same_v

template< class T, class U >
inline constexpr bool is_same_v = is_same<T, U>::value;

然后就变成了

static_assert(std::is_same_v<decltype(var1), decltype(var2)>);

【讨论】:

  • 另一方面,这实际上是同一件事,但现在需要 C++17 而不是 11
【解决方案2】:

有没有更好的方法在编译时判断两个变量是否具有相同的类型?

不,std::is_same 是要走的路。你当然可以使用std::is_same_v,作为@L.F.评论,但这基本上是相同的哲学。

是否有另一种方法可以在编译时判断两个变量是否具有相同的类型?

是的,如answer所示。

【讨论】:

    【解决方案3】:

    这里的实际问题并不完全清楚,但确保两个变量具有相同类型的最简单方法是这样编写它们:

    int var1 = /* whatever */;
    int var2 = /* whatever */; // var1 and var2 have the same type
    

    如果你是auto 的粉丝,而不是编写实际类型,你可以编写代码来简单地定义与第一个相同类型的第二个变量:

    auto var1 = /* whatever */;
    decltype(var1) var2 = /* whatever */; // var1 and var2 have the same type
    

    另一种可能性是编写一个接受两个相同类型参数的模板函数:

    template <class Ty> void f(Ty var1, Ty var2) { /* do something */ }
    f(var1_expression, var2_expression);
    

    如果var1_expressionvar2_expression的类型不同,模板实例化会失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 2023-04-04
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      相关资源
      最近更新 更多