C++:具有可变参数的 Hacky 参数模式

Posted

技术标签:

【中文标题】C++:具有可变参数的 Hacky 参数模式【英文标题】:C++: Hacky parameter pattern with variadic arguments 【发布时间】:2018-08-08 21:07:06 【问题描述】:

是否可以使用 C++ 可变参数来定义一个完全允许以下调用的函数:

f(int, char)
f(int, char, char)
f(int, char, char, int)
f(int, char, char, int, char)
...

如果 n 是素数,则每个第 n 个参数都是 char,否则是 int。函数只能这样调用;它不能与其他参数模式一起编译(例如,f(2, 2) 是一个错误,但 f(2, '2') 是可以的)。

【问题讨论】:

请向我们展示您的尝试。解释一个可能的用例也可能不是一个坏主意。 您知道f(int,char) 可以被称为f(2,2) 而不会出错,并且正在寻找一种方法使其成为错误,或者是否足以让签名正确? 实际上,这没有用例。我只是想知道是否有可能;-) 感谢自动投射的提示;我不关心签名中使用的类型,而是更关心如何创建这种模式。 【参考方案1】:

假设:

constexpr bool is_prime(size_t);

然后是这样的:

template <typename... Ts> struct typelist;

template <size_t... Is>
constexpr auto expected(std::index_sequence<Is...>)
    -> typelist<std::conditional_t<is_prime(Is+1), char, int>...>;

template <typename... Ts,
    std::enable_if_t<std::is_same<
        typelist<Ts...>,
        decltype(expected(std::index_sequence_for<Ts...>))
        >::value, int> = 0>
auto f(Ts... ts);

【讨论】:

太棒了!非常简洁优雅。 2 不是一个有效的charf(int,char) 可以无错误地调用为f(2,2) 吗? (我指的是“它不能与其他参数模式一起编译(例如f(2, 2) 是一个错误,但f(2, '2') 是可以的)。”) @user463035818 有效的关注,但最好在 OP 解决。我也想知道。 @user463035818 试试static_assert(std::is_same_v&lt;decltype(2), char&gt;); @IgorR。我知道2 不是char,我只是想知道如何满足OP 提出的要求

以上是关于C++:具有可变参数的 Hacky 参数模式的主要内容,如果未能解决你的问题,请参考以下文章

具有不同编译器的 C++ 和可变参数

Python C++ API - 具有可变数量参数的重载函数

Frida Hook可变参数

C语言中如何实现可变参函数

Go语言 可变参数(变参函数)

spark UDF 怎么实现参数数量可变,不传参时候,有默认值。见下图?