在C ++中检查编译时类型是否为std :: basic_string <t>

时间:2018-08-15 16:13:58

标签: c++ templates

我在我的C ++代码中定义了is_string:

#include <string>

template <typename T>
struct is_string
{
    static const bool value = false;
};

template <class T, class Traits, class Alloc>
struct is_string<std::basic_string<T, Traits, Alloc>>
{
    static const bool value = true;
};

int main()
{
    std::cout << is_string<std::string>::value << std::endl;
    std::cout << is_string<std::wstring>::value << std::endl;

    return 0;
}

对于std :: string和std :: wstring都是如此。

但是我需要这样的谓词:

is_string<char, std::string>::value //to be true
is_string<char, std::wstring>::value //to be false
is_string<wchar_t, std::string>::value //to be false
is_string<wchar_t, std::wstring>::value //to be true

是否可以实施?

3 个答案:

答案 0 :(得分:5)

尝试一下:

template <typename T, typename S>
struct is_string
{
  static const bool value = false;
};

template <class T, class Traits, class Alloc>
struct is_string<T, std::basic_string<T, Traits, Alloc>>
{
  static const bool value = true;
};

在这种情况下,一个简单的解决方案是:

template<class T, class S>
using is_string = std::is_same<T, typename S::value_type>;

(但是,它不会检查第二种类型是否实际上是字符串,如果您认为合适的话-此解决方案将检查第二种类型是否为包含第一种类型的元素的 any 容器类型)

答案 1 :(得分:2)

首先,您需要使is_string带有两个模板参数。

template <typename T, typename = void>
struct is_string
{
    static const bool value = false;
};

template <class T, class Traits, class Alloc>
struct is_string<std::basic_string<T, Traits, Alloc>, void>
{
    static const bool value = true;
};

然后

template <class T, template <typename, typename, typename> class STRING>
struct is_string<T, STRING<T, std::char_traits<T>, std::allocator<T>>>
{
    static const bool value = true;
};

LIVE

答案 2 :(得分:0)

也许是这样的:

template<typename x_Char, typename x_String>
struct is_string
{
    static constexpr bool const value
    {
        (
            ::std::is_same_v<::std::string, x_String>
            or
            ::std::is_same_v<::std::wstring, x_String>
        )
        and
        ::std::is_same_v<typename x_String::value_type, x_Char>
    };
};

static_assert(true == is_string<char, std::string>::value); //to be true
static_assert(false == is_string<char, std::wstring>::value); //to be false
static_assert(false == is_string<wchar_t, std::string>::value); //to be false
static_assert(true == is_string<wchar_t, std::wstring>::value); //to be true

online compiler

要处理分配器:

template<typename x_Char, typename x_String>
struct is_string
: ::std::false_type {};

template<typename x_Char, typename x_CharTrait, typename x_Allocator>
struct is_string<x_Char, ::std::basic_string<x_Char, x_CharTrait, x_Allocator>>
: ::std::true_type {};

online compiler