c++ std::调用函数template/lambda失败

olqngx59  于 2023-07-01  发布在  其他
关注(0)|答案(3)|浏览(115)

我怎么才能让它工作?(C++17/20)注:我必须在这里使用std::invoke,因为在真实的代码中,我唯一能保证的是这个可调用的是可调用的。

#include <bits/stdc++.h> // to include everything

int main() {
    const auto func = [&]<typename T>(const std::string& h) {
        T t;
        std::cout << t << " " << h << "\n";
    };
    std::invoke(func<std::string>, std::string("Hello"));
}

错误:

<source>:17:33: error: expected primary-expression before '>' token
   17 |     std::invoke(func<std::string>, std::string("Hello"));
ma8fv8wu

ma8fv8wu1#

lambda不是模板,但它的operator()是。
由于T是不可演绎的,你可以这样写:

std::invoke([&](const std::string &s) { func.operator()<std::string>(s); },
            std::string("Hello"));

或者更“简单”:

func.operator()<std::string>("Hello");

Demo

fslejnso

fslejnso2#

问题是你的lambda func不是一个函数模板,而是有一个模板化的operator()
使用std::invoke的一种方法是将func实际更改为函数模板

#include <string>
#include <iostream>
#include <functional>

template <typename T>
void func(const std::string& h)
{
    T t;
    std::cout << t << " " << h << "\n";
}

int main() 
{
    std::invoke(func<std::string>, std::string("Hello"));
}

Live demo - Godbolt

**注意:**最好避免#include <bits/stdc++.h>

f8rj6qna

f8rj6qna3#

一种方法是传递指向成员的指针函数(&decltype(f)::operator()<int>),然后给予它对象(f)和参数(std::string

#include "bits/stdc++.h"

int main() {
    const auto f = []<typename T>(std::string) -> void {};
    std::invoke(&decltype(f)::operator()<int>, f, "hello");
}

相关问题