Templates 可变元组调用函数中的模板参数不匹配

Templates 可变元组调用函数中的模板参数不匹配,templates,c++17,variadic-templates,template-argument-deduction,generic-lambda,Templates,C++17,Variadic Templates,Template Argument Deduction,Generic Lambda,为什么编译器不能匹配invoke()函数中的模板参数F。 有没有我不知道的非推断上下文?? 如何修复呢 //使用所有元组参数调用函数。 模板 自动调用(F&&F,std::index\u序列,元组&&t) { 返回f(std::get(t)…); } 模板 自动调用(F&&F、元组&&t) { constexpr std::size\u t uiLength=std::tuple\u size\u v; 返回调用(std::forward(f), std::make_index_sequenc

为什么编译器不能匹配
invoke()
函数中的模板参数
F
。 有没有我不知道的非推断上下文?? 如何修复呢

//使用所有元组参数调用函数。
模板
自动调用(F&&F,std::index\u序列,元组&&t)
{
返回f(std::get(t)…);
}
模板
自动调用(F&&F、元组&&t)
{
constexpr std::size\u t uiLength=std::tuple\u size\u v;
返回调用(std::forward(f),
std::make_index_sequence{},
标准:正向(t));
}
模板
结构A{
使用D=int;
};
模板
自动生成(T&…){
返回std::make_tuple(A{};
}
int main()
{
invoke([](auto&,auto&){},std::make_tuple(A{},A{}));//有效
//auto a=invoke(make,std::make_tuple(a{},a{}));//不编译,但为什么??
}
有没有我不知道的非推断上下文??如何修复呢

问题是不能将模板函数的名称作为函数的参数传递

template<typename... T>
auto make(T&...){
    return std::make_tuple(A<T>{}...);
}

// ...

auto a = invoke(make, std::make_tuple(A<int>{}, A<double>{}));
auto a = invoke([](auto & ... rData){ return std::make_tuple(A<decltype(rData)>{}...);},
                std::make_tuple(A<int>{}, A<double>{}));

非主题建议:使用不同的名称重命名
invoke()
myInvoke()
,通过示例)以减少与
std::invoke()

名称冲突的风险另一种解决方案是将函数定义为静态lambda:

static const auto makeDataHandles=[](auto&…t){
返回std::make_tuple(A{};
}