c++ - 根据模板函数类型推断变量类型

标签 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?
}

问题是如何表达B?我尝试了以下方法,但它错误地指出当我调用 f

时编译器无法推断 B
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::declvaldecltype 的更多信息,请参阅:https://en.cppreference.com/w/cpp/utility/declvalhttps://en.cppreference.com/w/cpp/language/decltype

关于c++ - 根据模板函数类型推断变量类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57641011/

相关文章:

c++ - 通过 perl 脚本过滤 C++?

c++ - 来自 lineEdit 的 int 输入

内置类型的基于 C++ 类型的分派(dispatch)

c++ - 如何遍历 std::index_sequence

c++ - 内存中的静态和全局变量

c++ - 如何使用copy_if从2d vector 中复制特定项目

c++ - 指向实现模式的指针

php - 正则表达式,多次出现的两个字符串之间的任意字符串

c++ - 保留一个 reference_wrapper 对象的 vector ,这怎么可能?

c++ - 创建非 odr 使用的文字类型