在显式构造函数中键入推断

时间:2015-08-08 15:07:50

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

我使用以下代码在相关单元之间进行转换,从而使用某些类型的安全提示。 。

#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<double>(0.5),这会导致整洁dbSPL(Pascal(0.5))超过更详细的dbSPL<double>(Pascal<double>(0.5))

4 个答案:

答案 0 :(得分:6)

改为使用帮助函数:

template <typename T>
dbSPL<T> make_dbspl(T t)
{
    return dbSPL<T>(Pascal<T>(t));
}

int main()
{
    auto dbspl = make_dbspl(0.5);
}

DEMO

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

  

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

没有

语言的语法和语义都不支持或不支持。