我怎么才能让它工作?(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"));
3条答案
按热度按时间ma8fv8wu1#
lambda不是模板,但它的
operator()
是。由于
T
是不可演绎的,你可以这样写:或者更“简单”:
Demo
fslejnso2#
问题是你的lambda
func
不是一个函数模板,而是有一个模板化的operator()
。使用
std::invoke
的一种方法是将func
实际更改为函数模板:Live demo - Godbolt
**注意:**最好避免#include <bits/stdc++.h>。
f8rj6qna3#
一种方法是传递指向成员的指针函数(
&decltype(f)::operator()<int>
),然后给予它对象(f
)和参数(std::string
)