C++ 使变量类型取决于上下文?
C++ make type of variable depend on context?
我有以下代码:
// Case #1
float f = 1.0f;
float f2 = sqrt(f * pi);
// Case #2
double d = 1.0;
double d2 = sqrt(d * pi);
有什么方法可以定义变量 pi
以便 operator*
和 sqrt
将在案例 #1 中对 float
进行操作,但将对 double
s 在案例#2?
也许可以使用 C++14 变量模板?
有点。你当然可以定义这样一个 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>);
更直接地说,您可以根据类型定义一些刚刚重载 operator*
的 pi
对象:
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; }
};
这可以让你得到你想要的语法,但那很奇怪,不要这样做。
我有以下代码:
// Case #1
float f = 1.0f;
float f2 = sqrt(f * pi);
// Case #2
double d = 1.0;
double d2 = sqrt(d * pi);
有什么方法可以定义变量 pi
以便 operator*
和 sqrt
将在案例 #1 中对 float
进行操作,但将对 double
s 在案例#2?
也许可以使用 C++14 变量模板?
有点。你当然可以定义这样一个 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>);
更直接地说,您可以根据类型定义一些刚刚重载 operator*
的 pi
对象:
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; }
};
这可以让你得到你想要的语法,但那很奇怪,不要这样做。