我们可以在编译时验证函数的输入是模板的特化。即以下代码验证 f
的输入是 struct Holder 的某种特化。
template<typename T>
struct Holder<T> {...};
template<typename T>
void f(Holder<T> h) {...};
我想验证一组可变参数是模板的特化。 更准确地说,我想区分两组连续的可变参数——一组是模板的特化,一组不是。 以下是一个示例,说明如果语法允许的话它可能是什么样子 -
template<...Args1, ...Args2>
void f(Holder<Args1>.... args_which_are_specializations_of_Holder, Args2... args_which_are_not) {
use_holders(args_which_are_specializations_of_Holder...);
use_rest(args_which_are_not...);
return;
}
这可能吗?
谢谢,
最佳答案
您可以将args
存储在tuple
中并计算最后一个Holder
参数的索引,然后提取Holder
和普通参数的索引,并将它们转发给相应的函数。
#include <tuple>
template<class T>
constexpr bool is_holder = false;
template<class T>
constexpr bool is_holder<Holder<T>> = true;
template<class... Args>
void f(Args... args) {
constexpr auto holder_index = (is_holder<Args> + ... + 0);
auto args_tuple = std::tuple(args...);
[&args_tuple]<auto... Is>(std::index_sequence<Is...>) {
use_holders(std::get<Is>(args_tuple)...);
}(std::make_index_sequence<holder_index>{});
[&args_tuple]<auto... Is>(std::index_sequence<Is...>) {
use_rest(std::get<Is + holder_index>(args_tuple)...);
}(std::make_index_sequence<sizeof...(Args) - holder_index>{});
}
关于c++ - 可变参数,它们都是模板类型的特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73279731/