This link没有回答我的问题所以我会在这里问:
基本上我想写一个模板函数
template <typename Out, typename In>
Out f(In x);
这里我总是需要指定Out
打电话时 f
.我不想每次都这样做,所以我基本上想要
template <typename Out = In, typename In>
Out f(In x);
这意味着如果我不指定 Out
, 它将默认为 In
.然而,这在 C++11 中是不可能的。
所以我的问题是,有什么办法可以达到这样的效果:
- 调用
f(t)
将实例化f<T,T>(t)
或更一般地说f<typename SomeThing<T>::type, T>
- 调用
f<U>(t)
将实例化f<U, T>(t)
最佳答案
您可能永远不想指定 In
而是推导它,对吗?
在这种情况下你需要重载函数:
template <typename Out, In>
Out f(In x);
template <typename T>
T f(T x);
调用它:
f(42);
f<float>(42);
...但不幸的是,这对于 f<int>(42)
是模棱两可的| .不管怎样,我们可以使用 SFINAE 适本地禁用其中一个重载:
template <
typename Out,
typename In,
typename = typename std::enable_if<not std::is_same<Out, In>::value>::type
>
Out f(In x);
template <typename T>
T f(T x);
为了避免实现中的冗余,让两个函数分派(dispatch)到一个共同的实现中,f_impl
.
template <typename Out, typename In>
Out f_impl(In x) {
std::cout << "f<" << typeid(Out).name() <<
", " << typeid(In).name() <<
">(" << x << ")\n";
return x;
}
template <
typename Out,
typename In,
typename = typename std::enable_if<not std::is_same<Out, In>::value>::type
>
Out f(In x) {
std::cout << "f<Out, In>(x):\t ";
return f_impl<Out, In>(x);
}
template <typename T>
T f(T x) {
std::cout << "f<T>(x):\t ";
return f_impl<T, T>(x);
}
int main() {
f(42);
f<float>(42);
f<int>(42);
}
关于c++ - 模板参数默认为后一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14508805/