【问题标题】:Type inference in explicit constructors显式构造函数中的类型推断
【发布时间】:2015-10-31 22:31:43
【问题描述】:

我正在使用以下在相关单元之间转换的代码来玩弄一些类型安全的想法。 . .

#include <cmath>
#include <limits>

template <typename T>
class Pascal
{

private:
    T val;

public:
    explicit Pascal(const T val_)
    {
        val = val_;
    }

    operator T() const
    {
        return val;
    }

};

template <typename T>
class dbSPL {
private:
    T val;

public:
    explicit dbSPL(const Pascal<T> p)
    {
        auto infProtect = std::numeric_limits<T>::min();
        val = 20.0 * std::log10( infProtect + p / 20e-6 );
    }


    operator T() const
    {
        return val;
    }


};

我想知道是否可以从构造函数参数类型推断模板类型,而不是显式声明模板参数。例如auto p = Pascal(0.5) 而不是输入auto p = Pascal&lt;double&gt;(0.5),这将导致更简洁的dbSPL(Pascal(0.5)) 而不是更冗长的dbSPL&lt;double&gt;(Pascal&lt;double&gt;(0.5))

【问题讨论】:

    标签: c++ templates c++11 constructor


    【解决方案1】:

    改用辅助函数:

    template <typename T>
    dbSPL<T> make_dbspl(T t)
    {
        return dbSPL<T>(Pascal<T>(t));
    }
    
    int main()
    {
        auto dbspl = make_dbspl(0.5);
    }
    

    DEMO

    【讨论】:

      【解决方案2】:

      解决此问题的一种方法是创建在参数类型上模板化的工厂函数,然后返回维度化类型

      【讨论】:

        【解决方案3】:

        正如其他人所说,为此使用包装函数。 我要补充的是,即使在 c++ 标准库中也使用这种方法,例如c++11 中的 std::make_pair 或 std::make_shared 。这样做的原因是,当您编写像 T t(x); 这样的声明时,T 是一个类型名称,而对于模板,类型名称包含模板参数。此外,如果 T 构造函数本身是模板,则此构造函数模板参数将从 x 的类型推断,T 本身没有模板参数。

        【讨论】:

          【解决方案4】:

          我想知道是否可以从构造函数参数类型推断模板类型,而不是显式声明模板参数

          没有。

          语言的语法和语义都不支持也不能支持这一点。

          【讨论】:

            猜你喜欢
            • 2019-09-23
            • 2020-10-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-09-03
            • 2022-01-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多