【问题标题】:Variadic convertible check for arguments in a class可变参数可转换检查类中的参数
【发布时间】:2015-05-19 16:28:57
【问题描述】:

我希望创建一个类来检查两个参数类型列表,以查看第一个列表的所有参数是否可以转换为第二个列表。到目前为止,我有这样的事情:

template <typename OArg> 
class conv{
  public:
    template<typename IArg>
    static bool check(){
      return std::is_convertible<IArg,OArg>::value;
    }
};

template <typename OArg, typename... OArgs>
class conv{
  public:
    template<typename IArg, typename... IArgs>
    static bool check(){
      return Op<OArg>::check<IArg>() && Op<OArgs...>::check<IArgs...>();
    }
};

我想这样使用它:

bool pass = conv<char,a_class,float>::check<float,int,b_class>();

编译时我得到:

recursive.cpp:19:7: error: redeclared with 2 template parameters
 class Conv{
       ^
recursive.cpp:10:7: note: previous declaration ‘template<class OArg> class Conv’ used 1 template parameter
 class Conv{

在检查时我没有IArgsOArgs 的实例 您能提出任何解决方案吗?

【问题讨论】:

    标签: c++ c++11 types variadic-templates variadic


    【解决方案1】:

    您不能重载类模板。您可以对它们进行部分专业化,但在这里没有必要这样做。借用@Columbo的bool_pack trick

    template<bool...> struct bool_pack;
    template<bool... b> 
    using all_true = std::is_same<bool_pack<true, b...>, bool_pack<b..., true>>;
    
    template <typename... OArgs>
    class conv{
      public:
        template<typename... IArgs>
        static bool check(){
          return all_true<std::is_convertible<IArgs, OArgs>::value...>::value;
        }
    };
    

    【讨论】:

      猜你喜欢
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 2011-07-11
      • 2013-09-29
      • 2021-05-30
      相关资源
      最近更新 更多