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视图中)