Ama*_*tam 4 c++ templates c++14
我有一个模板功能:
// Overloaded functions, Class1In, Class1Out, Class2In and Class2Out
// are defined in the code.
Class1Out Init(Class1In one) { ... }
Class2Out Init(Class2In two) { ... }
template <class A>
void f(A a, int retry_count) {
B b = Init(a); // How to express B?
}
Run Code Online (Sandbox Code Playgroud)
问题是我该如何表达B?我尝试了以下操作,但错误指出在我调用时编译器无法推论Bf
template <class A, class B>
void f(A a, int retry_count) {
B b = Init(a); // compiler error: Cannot deduce template parameter B
}
Run Code Online (Sandbox Code Playgroud)
我无法真正进行Init外部调用,f因为该函数通过调用自身重试,并且b每次调用时都需要创建一个新实例。
我将如何实现?
您可以使用auto,但通常可以使用此技巧来确定类型B:
using outType = decltype(Init(std::declval<A&>()));
Run Code Online (Sandbox Code Playgroud)
对于您的特殊情况,您还可以使用更简单的格式(感谢用户max66):
using outType = decltype(Init(a));
Run Code Online (Sandbox Code Playgroud)
这使您b无需实例化即可知道的类型。
如果需要实例化b,也可以尝试
auto b = Init(a);
using outType = decltype(b);
Run Code Online (Sandbox Code Playgroud)
在下面的代码中,我展示了添加一些样板代码的用法。
#include <type_traits>
class Class1Out{};
class Class2Out{};
class Class1In{};
class Class2In{};
Class1Out Init(Class1In one);
Class2Out Init(Class2In two);
template <class A>
void f(A a, int retry_count) {
using outType = decltype(Init(std::declval<A&>()));
outType b = Init(a); // How to express B?
}
int main(){
Class1In in1{};
Class2In in2{};
f(in1, 4);
f(in2, 4);
}
Run Code Online (Sandbox Code Playgroud)
有关更多信息std::declval,decltype请参见:https : //en.cppreference.com/w/cpp/utility/declval和https://en.cppreference.com/w/cpp/language/decltype