使用decltype的类型的条件声明

时间:2018-01-01 03:53:45

标签: c++ c++11 templates decltype

我认为可以在模板函数中使用decltype声明条件类型。但似乎没有。任何人都可以指出我的测试代码有什么问题吗?

#include <boost/type_index.hpp>
using boost::typeindex::type_id_with_cvr;

#define print_type(var) do { \
  std::cout << type_id_with_cvr<decltype(var)>().pretty_name() << std::endl; \
} while(0)

template <typename T1, typename T2>
auto max(T1 a, T2 b) -> decltype(a < b ? b : a) {
  decltype(a < b ? b : a) c = a < b ? b : a;
  print_type(c);
  return a < b ? b : a;
}

int main() {
  int i = 10;
  double d = 3.3;

  decltype(i < d? d : i) r = i < d? d : i;
  print_type(r); // -> double
  std::cout << r << std::endl; // 10
}

1 个答案:

答案 0 :(得分:3)

我想你的意图是

decltype( a < b ? a : b )

是在b时获取a < b的类型,否则获取a的类型。

那就是:我想您的意图是根据ab的欠幅时间值获得确定运行时间的类型。

这在C ++中是不可能的,因为必须确定变量的类型编译时间

使用decltype(),您可以获得三元运算符的类型

a < b ? a : b

不依赖于ab的值,而只取决于其类型。

所以,在案件中

decltype(i < d? d : i)

其中iintddouble,您获得double,其值为i和{{ 1}}无关紧要。