C++;:具有可变参数的Hacky参数模式 是否可以使用C++变量参数定义一个函数,它可以完全调用以下调用: f(int, char) f(int, char, char) f(int, char, char, int) f(int, char, char, int, char) ...

C++;:具有可变参数的Hacky参数模式 是否可以使用C++变量参数定义一个函数,它可以完全调用以下调用: f(int, char) f(int, char, char) f(int, char, char, int) f(int, char, char, int, char) ...,c++,c++11,c++14,variadic-functions,C++,C++11,C++14,Variadic Functions,其中,如果n是素数,则每个n参数都是char,否则它是int。函数只能以这种方式调用;它不会与其他参数模式一起编译(例如,f(2,2)是一个错误,但f(2,'2')是正常的)。假设: constexpr bool is_prime(size_t); 然后像这样: template <typename... Ts> struct typelist; template <size_t... Is> constexpr auto expected(std::index_se

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

假设:

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);
模板结构类型列表;
模板
应为constexpr自动(std::index_序列)
->类型表;
模板=0>
自动f(Ts…Ts);

请向我们展示您的尝试。解释一个可能的用例也可能不是一个坏主意。你知道
f(int,char)
可以被称为
f(2,2)
而没有错误,并且正在寻找一种方法使其成为错误,或者它足以获得正确的签名吗?实际上,这没有用例。我只是想知道这是否可能;-)感谢您的提示与自动铸造;我不关心签名中使用的类型,但更关心如何创建此模式。太棒了!非常简洁和优雅。但是
2
不是一个有效的
char
f(int,char)
可以作为
f(2,2)
调用而不会出错吗?(我指的是“
f(2,2)
是一个错误,但
f(2,'2')
是可以的。”)@user463035818是一个值得关注的问题,但可能最好在OP中解决。我也很想知道这一点。@user463035818 Try
static\u assert(std::is\u same\v)@IgorR。我知道
2
不是
char
,我只是想知道如何满足OP规定的要求