c++ - 可变参数,它们都是模板类型的特化

标签 c++ c++17 variadic-templates variadic-functions sfinae

我们可以在编译时验证函数的输入是模板的特化。即以下代码验证 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>{});
}

Demo

关于c++ - 可变参数,它们都是模板类型的特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73279731/

相关文章:

java - 我不能让多个小程序与我的 Cpp 服务器通信

c++ - 二元运算符和重载、加法等

c++ - Cocos2d-x 中的 CCCallFunc 及其子类

c++ - 奇怪的 basic_string 构造函数 c++17

c++ - Variadic 模板和 "expected a type"错误

c++ - 选择要在 OpenCV 中使用的网络摄像头

c++ - 检查两个函数或成员函数指针的签名是否相等

c++ - 如何使用推导指南为 C++ 类模板提供两个兼容的名称?

C++11 可变参数模板在类中调用函数

c++ - 需要有关在 gcc-7.2.0 中有编译错误但在 gcc-6.4.0 中没有的代码的帮助