通过参数区分功能模板和SFINAE

时间:2017-03-25 20:29:03

标签: c++ c++11 template-meta-programming sfinae typetraits

我打破了将功能模板分解为三组的汗水:一组产生采用积分的函数,一组采用浮点数,另一组采用任何其他函数(ostringstream::<<接受)。到目前为止,我甚至无法做到这一点,所以有两组,如:

namespace my {

template<typename T>
struct logical_not
:
    std::integral_constant<bool, !T::value>
{};

template <typename T>
using static_not = typename std::conditional<
    T::value,
    std::false_type,
    std::true_type
>::type;

template<typename T>
std::string to_string(
    const T& val, 
    typename std::enable_if< std::is_integral<T>::value >::type* = 0)
{
    // integral version (ostringstream method would be replaced by a simple algorithm that forms a string)
    std::ostringstream os;

    os << val;

    return os.str();
}


template<typename T>
std::string to_string(
    const T& val, 
    //typename std::enable_if< logical_not<std::is_integral<T>>::type >::type* = 0)
    typename std::enable_if< static_not<std::is_integral<T>> >::type* = 0)
{
    std::ostringstream os;

    os.flags(std::ios::fixed);
    os.precision(2);

    os << val;

    return os.str();
}

} // my

我从其他答案中复制了两个否定函数,我将它们的名字保留下来,以便更容易区分。我发现类型特征令人难以置信的混乱,我认为我得到的逻辑错误错误是对特定的否定包装器的错误用法。

logical_not错误为Illegal type for non-type template parameter,并且在类指针类型的实例中使用static_not:'my::to_string': no matching overloaded function found

如果可以,请告诉我正确的方向!我的观点是为整数类型添加更快的实现(不分配ostringstream实例),使用浮点类型调整精度,并具有处理其他类型的函数。很可能没有&#34;否定&#34;最终版本需要包装器,但我很好奇他们为什么不能工作。

编辑: 我已经意识到我需要4组,第4组是boolan(因为boolen也是一个整体类型)。因此,建立在max66的答案之上,修改一个功能并添加另一个功能,实现了预期的功能:

template<typename T>
std::string to_string(
    const T& val, 
    typename std::enable_if<
            std::is_same<bool, T>::value
    >::type* = 0)
{
    return val ? "true" : "false";
}

template<typename T>
std::string to_string(
    const T& val, 
    typename std::enable_if<
            std::is_integral<T>::value
        &&  (false == std::is_same<bool, T>::value)
    >::type* = 0)
{
    return "integral, but not bool";
}

1 个答案:

答案 0 :(得分:4)

比你想象的要简单。

tabFragment.setCurrentTab(/*tab index*/);