使用分支逻辑编译时间类型检查

时间:2015-02-19 19:30:13

标签: c++ c++11 stl compile-time

我正在尝试确定在编译时是否有办法同时对两种不同的类型进行条件检查。

示例:

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,我想调用一个函数。

编辑:更新了代码以显示我正在使用模板化的类。

2 个答案:

答案 0 :(得分:3)

您可以使用条件生成编译时常量,并创建一个匹配true_typefalse_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转换为其无符号对应元素(因此,如果Tchar或{{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 { } 的调用。