class 中参数的可变参数可转换检查
Variadic convertible check for arguments in a class
我想创建一个 class 来检查两个参数类型列表,看看第一个列表的所有参数是否都可以转换为第二个列表。到目前为止,我有这样的东西:
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{
在检查时我没有 IArgs
或 OArgs
的实例
您能提出任何解决方案吗?
您不能重载 class 模板。您可以对它们进行部分专业化,但这里没有必要这样做。借用@Columbo 的 :
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;
}
};
我想创建一个 class 来检查两个参数类型列表,看看第一个列表的所有参数是否都可以转换为第二个列表。到目前为止,我有这样的东西:
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{
在检查时我没有 IArgs
或 OArgs
的实例
您能提出任何解决方案吗?
您不能重载 class 模板。您可以对它们进行部分专业化,但这里没有必要这样做。借用@Columbo 的
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;
}
};