gpt4 book ai didi

c++ - 捕获可变模板参数的模板参数

转载 作者:行者123 更新时间:2023-11-28 00:21:04 25 4
gpt4 key购买 nike

我有以下(不完整的,不起作用的)定义:

template<typename T, std::function<Args(Context&)>... Funcs>
struct constructor
{
T construct(Context& ctx)
{
return T(Funcs(ctx)...);
}
};

我想要的是一个模板化的类——第一个参数是构造类型,接下来是要调用的函数,带有 std::function 的用户模板随后被调用以生成T 类型构造函数的值。

除了捕获函数的返回类型之外,我看不到使这段代码工作的可能性。我希望用户像这样使用它:

std::function<int(Context&)> ind = [](Context&) {return 2;};
Constructor<int, ind> c;
// c.construct(...) returns 2 by calling the constructor int(int) with argument
// ind(ctx) - which returns 2.

最佳答案

这可能正是您要查找的内容。请记住,std::function 不能是模板参数。

template <typename R> using Generator = std::function<R (Context&)>;

template <typename T, typename Generators, std::size_t... Is>
T constructImpl(Context& ctx, const Generators& generators,
std::index_sequence<Is...>) {
return T(std::get<Is>(generators)(ctx)...);
}

template <typename T, typename... Args>
class Constructor {
std::tuple<Generator<Args>...> generators;

public:
Constructor(Generator<Args>... generators)
: generators(std::move(generators)...)
{}

T construct(Context& ctx) {
return constructImpl<T>(ctx, generators,
std::index_sequence_for<Args...>());
}
};

用法:

Constructor<int, int> c([](Context&) { return 2; });
int i = c.construct(context);
assert(i == 2);

关于c++ - 捕获可变模板参数的模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27426805/

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