std :: enable_if string / char type

时间:2012-12-20 20:22:07

标签: c++ c++11

  

可能重复:
  “What happened to my SFINAE” redux: conditional template class members?

为什么我不能将其他参数传递给我的模板类?我只是在传递的类型是文字类型时才尝试启用特定参数。如果不是,请接受其他类型但不启用区分大小写的参数。

为什么下面没有编译?

#include <iostream>
#include <type_traits>

template<typename T>
struct is_literal
{
   enum{value = false};
};

template<>
struct is_literal<char>
{
   enum{value = true};
};

template<>
struct is_literal<char*>
{
   enum{value = true};
};

template<>
struct is_literal<const char*>
{
   enum{value = true};
};

template<typename Char, typename Traits, typename Alloc>
struct is_literal<std::basic_string<Char, Traits, Alloc>>
{
   enum
   {
      value = true
   };
};

template<typename T>
class Test
{
    public:
        bool Contains(T DataType, typename std::enable_if<is_literal<T>::value, bool>::type  CaseSensitive = true);
};

template<typename T>
bool Test<T>::Contains(T DataType, typename std::enable_if<is_literal<T>::value, bool>::type CaseSensitive)
{
    return true;
}


int main()
{
    Test<int> F;    //This line gives errors.. It gives none if I pass char, char*, const char*, std::string.
    F.Contains(1);
}

1 个答案:

答案 0 :(得分:3)

SFINAE只能在重载解析期间执行替换时发生。这意味着您必须拥有一个功能模板。在这种情况下,您在类模板中有一个非模板函数。这不起作用。您可以添加默认模板参数来解决此问题。

template <typename U = T>
bool Contains(U DataType, typename std::enable_if<is_literal<U>::value, bool>::type  CaseSensitive = true);