我正在尝试确定在编译时是否有办法同时对两种不同的类型进行条件检查。
示例:
template <typename T>
class MyClass
{
returnVal myFunction() const
{
// Is there a compile time way of doing this? std::conditional?
return myConditionFunction(std::is_same<char, T> || std::is_same<unsigned char, T>);
}
returnVal myConditionFunction(std::true_type& const) const
{
// perform calculations on char or unsigned char
}
returnVal myConditionFunction(std::false_type& const) const
{
// perform calculations on non-char/unsigned char types
}
};
如果类型是char或unsigned char,我想调用一个函数。
编辑:更新了代码以显示我正在使用模板化的类。
答案 0 :(得分:3)
您可以使用条件生成编译时常量,并创建一个匹配true_type
或false_type
的类型:
returnVal myFunction() const
{
typedef std::integral_constant<bool,
std::is_same<unsigned char, T>::value
|| std::is_same< char, T>::value> selector;
return myConditionFunction(selector());
}
请注意,std::true_type
仅为std::integral_constant<bool,true>
,std::false_type
也是如此。
答案 1 :(得分:2)
有很多方法可以做你想要的。如果您不想自己编写任何新模板,可以执行以下操作(伪代码,因为未指定returnVal
,并且未在任何地方指定或推导出T
):< / p>
#include <type_traits>
returnVal myFunction() const
{
return myConditionFunction(
typename std::is_same<unsigned char, typename std::make_unsigned<T>::type>::type());
}
returnVal myConditionFunction(std::true_type& const) const
{
}
returnVal myConditionFunction(std::false_type& const) const
{
}
这会使用类型特征库中的std::make_unsigned
元函数将T
转换为其无符号对应元素(因此,如果T
为char
或{{1} },unsigned char
将是std::make_unsigned<T>::type
)。然后,unsigned char
的结果用于调度到适当的函数实现。
或者,您可以编写自己的特征:
std::is_same
并像这样使用它:
template <typename T>
struct is_char_or_uchar
{
typedef false_type type;
static const bool value = false;
}
template<>
struct is_char_or_uchar<char>
{
typedef true_type type;
static const bool value = true;
}
template<>
struct is_char_or_uchar<signed char>
{
typedef true_type type;
static const bool value = true;
}
template<>
struct is_char_or_uchar<unsigned char>
{
typedef true_type type;
static const bool value = true;
}
或者,如果你有Boost,你可以使用boost::mpl::or_
和两次returnVal myFunction() const
{
return myConditionFunction(typename is_char_or_uchar<T>::type());
}
returnVal myConditionFunction(std::true_type& const) const
{
}
returnVal myConditionFunction(std::false_type& const) const
{
}
的调用。