C ++ make变量的类型取决于上下文?

时间:2017-03-06 16:38:56

标签: c++ c++14 variable-templates

我有以下代码:

// Case #1
float f = 1.0f;
float f2 = sqrt(f * pi);

// Case #2
double d = 1.0;
double d2 = sqrt(d * pi);

是否有任何方法可以定义变量pi,以便{1}}和operator*将在案例#1中的sqrt上运行,但会在{{1}上运行案例#2中的s?

使用C ++ 14变量模板可能有可能吗?

1 个答案:

答案 0 :(得分:11)

排序。你当然可以定义这样一个pi

template <class T> constexpr double pi = 3.14159...;
template <> constexpr long double pi<long double> = 3.14159...L;
template <> constexpr float pi<float> = 3.14159...F;

但是你必须指定你想要的pi

float f2 = sqrt(f * pi<float>);
double d2 = sqrt(d * pi<double>);

更直接地说,您可以根据类型定义一些刚刚重载pi的{​​{1}}对象:

operator*

这可以让你获得你想要的语法,但这很奇怪,不要这样做。