推导取决于模板功能类型的变量类型

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每次调用时都需要创建一个新实例。

我将如何实现?

Cur*_*hts 6

您可以使用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::declvaldecltype请参见:https : //en.cppreference.com/w/cpp/utility/declvalhttps://en.cppreference.com/w/cpp/language/decltype

  • 真好 但是,在这种情况下,`std :: declval &lt;A&&gt;`在我看来是多余的。您有一个`a,因此您可以使用outType = decltype(Init(a));`;来编写。应该可以。 (2认同)