【问题标题】:call template function with async使用异步调用模板函数
【发布时间】:2025-12-11 05:05:02
【问题描述】:

当函数接受模板参数时,需要异步运行函数。下面的代码无法编译,有什么帮助吗?

 template<typename T>
 void say(int n, T t) { 
    cout << " say: " << n << " " << t << endl;
 }

 template<typename F, typename... Ts>
 inline auto reallyAsync(F&& f, Ts&&... params){
   return std::async(
       std::launch::async,
       std::forward<F>(f),
       std::forward<Ts>(params)...);
 }

 int main() {
   int n = 10; float x = 100;
   say(n, x); // works
   reallyAsync(&say, n, x) ; // does not work
 }

【问题讨论】:

  • 这将有助于添加编译器抛出的错误
  • @Stormenet 或使用了哪个编译器。

标签: c++ multithreading asynchronous


【解决方案1】:

say 是一个 function-template,您不能获取 function-template 的地址,因为它还不是 function (见 cmets):

int main() {
   int n = 10; float x = 100;
   say(n, x);                // works because of template argument deduction
   reallyAsync(&say, n, x);  //fails because say isn't a resolved  function.
 }

但是,您可以传递 say 的实例化:

 int main() {
   int n = 10; float x = 100;
   say(n, x);                     // works
   reallyAsync(&say<decltype(x)>, n, x);
 }

输出:

say: 10 100
say: 10 100

Live Example

【讨论】:

    【解决方案2】:

    基本上,say 不是函数,它是函数模板。您无法使用&amp; 获取模板的地址。

    只是改变:

    reallyAsync(&say, n, x)
    

    到:

    reallyAsync(&say<float>, n, x)
    

    它应该可以工作。

    【讨论】:

      【解决方案3】:
      reallyAsync(&say, n, x) 
      

      say 是一个模板。在 C++ 中,您不能获取模板的地址。这是一个毫无意义的提议。

      了解模板和模板实例之间的区别很重要。模板只不过是某种规范。它不存在任何真实或有意义的术语。并且 address-of 运算符只能用于以某种方式存在于某处的真实的、实际的对象。

      要消除编译错误,您必须实例化模板,将其变成有形的东西:

      reallyAsync(&say<float>, n, x);
      

      从您的角度来看,这可能并不理想,并且违背了模板函数的目的。可能有一种更好的、不同的方式来完成你真正想要完成的任何事情,它不需要显式的模板实例化。

      【讨论】: