5

我有以下代码:

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

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

有什么方法可以定义变量pi,以便在案例 #1 中对 s 进行操作,但在operator*案例#2 中对 s 进行操作?sqrtfloatdouble

也许使用 C++14 变量模板是可能的?

4

1 回答 1

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刚刚重载的对象:operator*

struct Pi {
    template <class T> 
    decltype(pi<T>) operator*(T val) { return val * pi<T>; }

    template <class T> 
    friend decltype(pi<T>) operator*(T val, Pi) { return pi<T> * val; }
};

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

于 2017-03-06T16:42:44.780 回答