gpt4 book ai didi

c++ - 如何在可变参数模板之前推导模板

转载 作者:搜寻专家 更新时间:2023-10-31 00:11:29 25 4
gpt4 key购买 nike

我目前遇到以下问题,我的函数模板必须在可变参数模板之前声明,而编译器无法推断出它。

template<class F, class... Ts>
void update(F f){
for(auto t: get_range<Ts...>()){
apply(std::forward<F>(f), t);
}
}
..
cg.update<decltype(ftest),int,float>(ftest);
..

这个问题有好的解决方法吗?我想这样调用它

cg.update<int,float>(ftest);

我相信在 C++17 中我可以写

template<class... Ts>
void update(auto f){
for(auto t: get_range<Ts...>()){
apply(f, t);
}
}

但 clang 似乎还不支持它。

最佳答案

只需将 class F 参数放在可变参数 class...Ts 参数之后即可。

template<class... Ts>
void get_range(){ }

auto x = [](auto){};

template<class... Ts, class F>
void update(F f)
{
// The following `static_assert` assumes the function is being
// instantiated with `<int,float>`. It's just here to prove
// that `F` is not part of `Ts...`.

// Make sure that `F` is not being caught in `Ts...`:
static_assert(sizeof...(Ts) == 2, "");

// Make sure that `F` is actually `decltype(x)`:
static_assert(std::is_same<decltype(f), decltype(x)>{}, "");

// Call your function:
get_range<Ts...>();
}

int main()
{
update<int,float>(x);
return 0;
}

ideone example

关于c++ - 如何在可变参数模板之前推导模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33861539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com