【问题标题】:C++ make type of variable depend on context?C ++使变量的类型取决于上下文?
【发布时间】:2017-03-06 16:38:55
【问题描述】:

我有以下代码:

// 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 中对floats 进行操作,而在案例#2 中对doubles 进行操作?

也许使用 C++14 变量模板可以实现?

【问题讨论】:

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


    【解决方案1】:

    有点。你当然可以定义这样的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; }
    };
    

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

    【讨论】:

    • @T.C.类似的东西?
    • 你可以让它更简单——默认实现应该定义double值而不是inttemplate &lt;class T&gt; constexpr double pi = 3.0;
    • @Orient 好主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 2015-11-23
    • 1970-01-01
    相关资源
    最近更新 更多