gpt4 book ai didi

c++ - 提取函数参数类型作为参数包

转载 作者:行者123 更新时间:2023-11-30 03:52:02 29 4
gpt4 key购买 nike

这是 "unpacking" a tuple to call a matching function pointer 的后续问题,它询问如何以通用方式将 std::tuple 中的值作为参数提供给函数。给出的解决方案如下:

template<int ...>
struct seq { };

template<int N, int ...S>
struct gens : gens<N-1, N-1, S...> { };

template<int ...S>
struct gens<0, S...>
{
typedef seq<S...> type;
};

double foo(int x, float y, double z)
{
return x + y + z;
}

template <typename... Args>
struct save_it_for_later
{
std::tuple<Args...> params;
double (*func)(Args...);

double delayed_dispatch()
{
return callFunc(typename gens<sizeof...(Args)>::type());
}

template<int ...S>
double callFunc(seq<S...>)
{
return func(std::get<S>(params) ...);
}
};

int main(void)
{
std::tuple<int, float, double> t = std::make_tuple(1, 1.2, 5);
save_it_for_later<int,float, double> saved = {t, foo};
std::cout << saved.delayed_dispatch() << std::endl;
}

我的问题是是否有办法制作 save_it_for_later 的替代版本,它只采用 foo 作为模板参数,这样我们就不必提供 foo 的参数类型作为模板参数(或将其返回类型烘焙到 save_it_for_later 中)。有点像

int main(void) {
...
save_it_for_later2<foo> saved = {t};
...
}

我同样可以使用某种宏包装 foo 来提取所需的类型:

int main(void) {
...
save_it_for_later<MACRO_USING_DECLTYPE_OR_SOMESUCH(foo)> saved = {t};
...
}

这个问题似乎与原始问题正交,足以保证自己的票。

最佳答案

#include <tuple>
#include <utility>

template <typename> struct save_it_for_later_t;
template <typename Result, typename... Args>
struct save_it_for_later_t<Result (*)(Args...)> {
std::tuple<Args...> params;
Result (*fun)(Args...);
template <typename... Params>
save_it_for_later_t(Result (*fun)(Args...), Params&&... params)
: params(std::forward<Params>(params)...)
, fun(fun) {
}
// ...
};
template <typename Result, typename... Args, typename... Params>
save_it_for_later_t<Result(*)(Args...)>
save_it_for_later(Result (*fun)(Args...), Params&&... params) {
return save_it_for_later_t<Result(*)(Args...)>(fun, std::forward<Params>(params)...);
}

double foo(float, float, double);
int main() {
auto saved = save_it_for_later(foo, 1.2f, 3.4f, 5.6);
// ...
}

关于c++ - 提取函数参数类型作为参数包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30926764/

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