gpt4 book ai didi

c++ - 混合模板类型的模板参数包(带可选参数的 std::function 重新创建)

转载 作者:行者123 更新时间:2023-11-28 04:16:22 24 4
gpt4 key购买 nike

我正在尝试制作一个 std::function 替代方案,它支持带有默认值的可选参数。我尝试了几种不同的句法想法,但最现实的似乎是保存参数数据的专用模板的参数包。这是我想要的外部语法:

Function<
void /*Return type*/,
Arg<false, int> /*Required int parameter*/,
Arg<true, bool, true> /*Optional bool parameter that defaults to true*/
> func;

我希望维护 Function<ReturnType(args)>语法,但您似乎只能将类型名放在括号中,而不能将类放在括号中。这是我当前的代码:

template<bool Optional, typename Type, Type Default>
class Arg;

template<typename Type, Type Default>
class Arg<false, Type, Default> {};

template<typename Type, Type Default>
class Arg<true, Type, Default> {};

问题 1:我找不到使 false 不需要“默认”参数的方法特化。我已经尝试过使用默认构造函数的代理类,将第三个参数更改为指针并指定 nullptr(这在语法上并不是很理想),以及对类型的 const 引用(仍然需要来自用户端的三个参数)但似乎没有什么可以让 Function<false, Type> 接受两个参数.

问题 2:我找不到正确的语法来获取混合模板参数类型的参数包。我试过了(显然语法无效)

template<typename RetType, Arg<bool, typename Type, Type>... args>
class Function{};

甚至是双重/嵌套模板,但我也做不到。

所有这些间接寻址的真正原因是你不能在一个类模板中有多个参数包,所以我必须找到创造性的方法来指定可选参数,但我会采取任何我能得到的解决方案来实现这个在编译时运行,而不必动态构造这些函数。

我正在使用 C++20。

最佳答案

当第一个参数为 false 时,使第三个模板参数可选,您可以使用带有 std::enable_if 的默认参数:

template <bool Optional, typename T,
T Default = std::enable_if_t<!Optional, T>{}>
class Arg;

这边,Arg<false, int>相当于Arg<false, int, 0> ,而 Arg<true, int>格式错误。


您可以使用通用参数:

template <typename R, typename... Args>
class Function {
static_assert(std::conjunction_v<is_arg_v<Args>...>);
};

在哪里is_arg可以简单到

template <typename T>
struct is_arg :std::false_type {};
template <bool Optional, typename T, T Default>
struct is_arg<Arg<Optional, T, Default>> :std::true_type {};
template <typename T>
inline constexpr bool is_arg_v = is_arg<T>::value;

关于c++ - 混合模板类型的模板参数包(带可选参数的 std::function 重新创建),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56504752/

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