C++ 我如何创造价值型特质?

C++ 我如何创造价值型特质?,c++,string,traits,value-type,C++,String,Traits,Value Type,我正在编写一个程序,该程序将大量处理各种类型的字符串(即std::string,std::string\u view,const char*,char[],以及具有各种图表的朋友)。所以,我对写一个trait很感兴趣,它可以抽象出类泛型数组结构的值类型。对于前面列出的类型,正确的返回类型应该是char 然而,我似乎无法获得正确的实现来允许泛型类型。考虑以下尝试: 模板 结构值类型{ 使用type=std::conditional\u t< 标准::是第五类, typename T::value\

我正在编写一个程序,该程序将大量处理各种类型的字符串(即
std::string
std::string\u view
const char*
char[]
,以及具有各种
图表的朋友)。所以,我对写一个trait很感兴趣,它可以抽象出类泛型数组结构的值类型。对于前面列出的类型,正确的返回类型应该是
char

然而,我似乎无法获得正确的实现来允许泛型类型。考虑以下尝试:

模板
结构值类型{
使用type=std::conditional\u t<
标准::是第五类,
typename T::value\u type,
std::有条件的<
标准::是指针吗,
标准::移除指针,
//等等。
>;
};
当然,这不会编译,因为并非所有类型都有嵌套的
value\u type
typedef


有什么方法可以有效地实现这一特性吗?

您可以使用专门化(和SFINAE):

模板
结构值类型;
模板
结构值类型
{
使用type=typename T::value\u type;
};
模板
结构值类型
{
使用类型=T;
};
模板
结构值类型
{
使用类型=T;
};
// ...

您可以使用专门化(和SFINAE):

模板
结构值类型;
模板
结构值类型
{
使用type=typename T::value\u type;
};
模板
结构值类型
{
使用类型=T;
};
模板
结构值类型
{
使用类型=T;
};
// ...

您可以使用助手类模板。幸运的是,在隐式实例化期间不会实例化类型别名:

template <class T>
struct get_value_type {
  using type = typename T::value_type;
};

template <class T>
struct value_type {
  using type = typename std::conditional_t<
      std::is_class_v<T>,
      get_value_type<T>,
      std::conditional<std::is_pointer_v<T>, std::remove_pointer_t<T>, void> 
  >::type;
};
模板
结构获取值类型{
使用type=typename T::value\u type;
};
模板
结构值类型{
使用type=typename std::conditional\u t<
标准::是第五类,
获取\u值\u类型,
条件的
>::类型;
};

这还需要您将第二个
std::conditional\u t
更改为
std::conditional
,以便我们可以从返回的任何类型中获取
::type

您可以使用助手类模板。幸运的是,在隐式实例化期间不会实例化类型别名:

template <class T>
struct get_value_type {
  using type = typename T::value_type;
};

template <class T>
struct value_type {
  using type = typename std::conditional_t<
      std::is_class_v<T>,
      get_value_type<T>,
      std::conditional<std::is_pointer_v<T>, std::remove_pointer_t<T>, void> 
  >::type;
};
模板
结构获取值类型{
使用type=typename T::value\u type;
};
模板
结构值类型{
使用type=typename std::conditional\u t<
标准::是第五类,
获取\u值\u类型,
条件的
>::类型;
};

这还需要您将第二个
std::conditional\u t
更改为
std::conditional
,这样我们就可以从返回的任何类型中获取
::type

typename std::iterator\u traits::value\u type?它不适用于
const char*
,但无论如何都不能迭代(不在
std::string\u视图中包装它)那么
typename std::iterator\u traits::value\u type如何?它不适用于
const char*
,但无论如何,您都不能迭代它(不将其包装在
std::string\u视图中)