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

lea*_*vst 1 c++ templates constructor c++11

我正在使用以下代码来处理某些类型的安全提示,该代码在相关单元之间进行转换...

#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;
    }


};
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以从构造函数参数类型推断模板类型,而不是显式声明模板参数.例如auto p = Pascal(0.5),而不是打字auto p = Pascal<double>(0.5),那么这将导致更整洁dbSPL(Pascal(0.5))越过越详细dbSPL<double>(Pascal<double>(0.5)).

Pio*_*cki 6

使用辅助函数代替:

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

int main()
{
    auto dbspl = make_dbspl(0.5);
}
Run Code Online (Sandbox Code Playgroud)

DEMO