我在我的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;
}
Run Code Online (Sandbox Code Playgroud)
对于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
Run Code Online (Sandbox Code Playgroud)
有可能实现它吗?
试试这个:
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;
};
Run Code Online (Sandbox Code Playgroud)
在这种特定情况下,更简单的解决方案是:
template<class T, class S>
using is_string = std::is_same<T, typename S::value_type>;
Run Code Online (Sandbox Code Playgroud)
(但是,它不检查第二种类型实际上是一个字符串,如果你没关系 - 这个解决方案检查第二种类型是否是任何容纳第一种类型元素的容器)