C++;:具有可变参数的Hacky参数模式 是否可以使用C++变量参数定义一个函数,它可以完全调用以下调用: f(int, char) f(int, char, char) f(int, char, char, int) f(int, char, char, int, char) ...
其中,如果n是素数,则每个n参数都是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
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 Trystatic\u assert(std::is\u same\v)代码>@IgorR。我知道2
不是char
,我只是想知道如何满足OP规定的要求