我有一个模板函数:
// 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?
}
问题是如何表达B
?我尝试了以下方法,但它错误地指出当我调用 f
template <class A, class B>
void f(A a, int retry_count) {
B b = Init(a); // compiler error: Cannot deduce template parameter B
}
我真的不能在 f
之外调用 Init
,因为该函数通过调用自身进行重试,并且每次都需要创建一个新的 b
实例它被称为。
我将如何实现这一点?
最佳答案
您可以使用auto
,但通常您可以使用此技巧来确定类型B
:
using outType = decltype(Init(std::declval<A&>()));
对于您的特定情况,您还可以使用更简单的格式(感谢用户 max66):
using outType = decltype(Init(a));
这使您无需实例化即可知道 b
的类型。
如果你需要实例化b
那么你也可以试试
auto b = Init(a);
using outType = decltype(b);
在下面的代码中,我展示了添加一些样板代码的用法。
#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);
}
有关std::declval
和decltype
的更多信息,请参阅:https://en.cppreference.com/w/cpp/utility/declval和 https://en.cppreference.com/w/cpp/language/decltype
关于c++ - 根据模板函数类型推断变量类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57641011/