我使用以下代码在相关单元之间进行转换,从而使用某些类型的安全提示。 。
#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))
。
答案 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);
}
答案 1 :(得分:1)
解决此问题的一种方法是创建模板化参数类型的工厂函数,然后返回维度化类型
答案 2 :(得分:1)
正如其他人所说的那样使用包装函数。
我要补充的是,即使在c ++标准库中也使用这种方法,例如: c ++ 11中的std :: make_pair或std :: make_shared。原因是当您编写T t(x);
之类的声明时,T
是类型名称,而模板类型名称包含模板参数。此外,如果T
构造函数是模板本身,则此构造函数模板参数将来自x
T
本身的模板参数类型。
答案 3 :(得分:1)
我想知道是否可以从构造函数参数类型推断模板类型,而不是显式声明模板参数
没有
语言的语法和语义都不支持或不支持。