【发布时间】:2015-12-09 20:14:22
【问题描述】:
这可能是一个愚蠢的问题,但我还是想澄清一下。假设我有一个这样的模板函数:
template<class T> T getValue(const char *key) const;
将值作为T 从存储在key 下的内部存储返回(并且可能已经作为类型T)。
现在为了使用这个我需要在函数调用中指定模板返回类型T,例如:
int value = getValue<int>("myKey");
而我想要它做的是从上下文中推断出模板参数,特别是 lvalue,如下所示:
int value = getValue("myKey"); //getValue<int>() is instantiated with int being deduced automatically from lvalue
但我猜这是不可能的,但我对为什么很模糊。我知道使用auto 会使编译器无法推断出模板类型,但为什么也会这样呢?
【问题讨论】:
-
模板实例化只能从给定模板化对象(在这种情况下为函数)的参数中推断出它的参数,所以不,变量类型在推断中并不重要,你要么必须证明虚拟参数像在倒数第二个脚本代码中那样对其进行函数或硬编码。
-
直截了当的回答,谢谢。您是否愿意将其重新发布为答案,以便我接受?
-
可以通过返回一个具有
template<class T> operator T() const;转换函数的代理对象来提供类似的东西。该转换函数可以推导出类型T,因为需要在代理对象的类型和int value之间进行转换。当然,这与auto不同,因为它只会存储代理对象(可以使代理对象不可复制和不可移动,但auto&&和auto const&仍然有效)。 -
@dyp 这真是个有趣的主意!我刚刚对其进行了测试,它就像一个魅力。由于我将只在有限数量的类型上使用它,我什至可以完全摆脱模板,只需为我需要的每种类型拼出 operator() 重载。这确实是一个不错的选择。我想知道代理对象的开销是否值得,但这是另一个问题。