<分区>
我有一个与函数返回值的类型推导相关的问题。
首先,一些上下文,以显示我的期望。 假设我有这个函数模板:
template <typename T1, typename T2>
T1 foo( T2 t )
{
T1 a = static_cast<T1>(t); // dummy conversion,
return a; // just there to use t
}
然后,这不会构建,因为返回类型不能用于类型推导:
int a;
float v1 = foo(a);
char v2 = foo(a);
但是如果我添加请求的类型,那就没问题了:
int a;
auto v1 = foo<float>(a);
auto v2 = foo<char>(a);
现在是我的问题。我有一个类,它提供了一些数据的 setter/getter :
template<typename T>
struct MyClass
{
T data;
template<typename U>
U get() { return static_cast<U>(data); } // dummy code, returns an 'U'
};
用户代码可以用这个获取数据(构建良好):
MyClass<int> m;
auto v3 = m.get<float>();
但我想通过使用免费函数为用户代码提供第二种访问数据的方式,因此可以编写:
MyClass<int> m;
auto v4 = ff_get<float>(m);
问题是:
如何编写 ff_get()
?
我试过:
template <typename T1, typename T2>
T1 ff_get( T2 t )
{
return t.get<T1>();
}
但这不会构建,尽管在我看来它使用与上面的 foo
调用相同的语法。所以问题的第二部分是:为什么会失败?
(参见 live code)