使用lhs引用时自动模板推导

时间:2015-09-23 04:53:59

标签: c++ templates type-conversion type-deduction

我想知道我是否写了这样的东西:

Type &var = database.get<TYPE>(name);

假设database是一个能够存储不同数据类型的数据块的容器。为了获得对该数据块的引用,将name作为std::string传递给get(),以便在该调用的不同位置我可以访问某些“全局”变量。我有get()作为模板方法,我想保持这种方式。

我想要做的就是缩短这种称呼方式:

Type &var = database.get(name);

因此自动执行模板推导。现在我可以为此创建一个宏,但这不是我想要做的,因为我认为这种情况并不优雅。

虽然这种推论不起作用,因为我们需要一个模板参数。为什么编译器不能采用为变量设置的内容并自动将其作为模板参数传递?有没有办法做到这一点?在这种情况下,我不想进行任何类型的转换。我们可以省略吗?

2 个答案:

答案 0 :(得分:0)

抱歉,这是不可能的。您要做的是根据其参数的值来设置模板化函数的返回类型。 这不行。

如果模板参数很明显,则只能执行自动模板推导(如您所述)。例如:

template<_T> void func(_T param) { }

这可以称为

int a; 
func(a); //instead of func<int>(a);

这里编译器确切知道你要做什么。

因为所有模板都是在编译时解析的,所以无法根据任何模糊参数来改变方法返回类型。

你可以看看boost::any,这对你的工作做得很好。

答案 1 :(得分:0)

不,你不能这样做 - 语言规则根本不允许编译器考虑声明的var类型来执行扣除。 (注意,在通过获取函数模板的地址来初始化函数指针时,可以推导出函数模板的模板参数。但是,这不是在这种情况下发生的事情。)

但是,您可以使用auto轻松避免写入类型两次或引发任何不需要的转换:

auto& var = database.get<Type>(name);