C++ C++;键入trait以提取模板参数的专门化值

C++ C++;键入trait以提取模板参数的专门化值,c++,c++11,typetraits,C++,C++11,Typetraits,我有以下模板: template<typename T, const char *name_ > struct named { typedef T type; static constexpr const char *name = name_; }; 模板 名为{ T型; static constexpr const char*name=name\ux; }; 我希望有以下类型特征: 如果参数类型为“named”,则将提取类型和名称(2个不同) 若参数不同,将提取原始类

我有以下模板:

template<typename T, const char *name_ >
struct named {
  typedef T type;
  static constexpr const char *name = name_;
};
模板
名为{
T型;
static constexpr const char*name=name\ux;
};
我希望有以下类型特征:

  • 如果参数类型为“named”,则将提取类型和名称(2个不同)
  • 若参数不同,将提取原始类型和空字符串 类型
例如:

template<typename T>
void foo() {
  typename cppdi::extract_type<T>::type x;

  std::cout << "type: " << typeid(x).name() <<
               ", name: " << cppdi::extract_name<T>::value << std::endl;
}

char bar[] = "bar";

void test() {
  foo<int>();             // type: i, name:
  foo<named<int, bar>>(); // type: i, name: bar
}
模板
void foo(){
typename cppdi::extract_type::type x;

std::cout这样写你的特征:

template< typename T >
struct extract_type
{ using type = T; };

template< typename T, const char* S >
struct extract_type< named< T, S > >
{ using type = T; };

template< typename T >
struct extract_name
{ static constexpr const char* value = ""; };

template< typename T, const char* S >
struct extract_name< named< T, S > >
{ static constexpr const char* value = S; };
模板
结构提取类型
{使用type=T;};
模板
结构提取类型>
{使用type=T;};
模板
结构提取名称
{static constexpr const char*value=”“;};
模板
结构提取名称>
{static constexpr const char*value=S;};

单凭这一点是行不通的,你提供的代码在一些地方是非法的。我在这里修复了它们。

写下你的特征如下:

template< typename T >
struct extract_type
{ using type = T; };

template< typename T, const char* S >
struct extract_type< named< T, S > >
{ using type = T; };

template< typename T >
struct extract_name
{ static constexpr const char* value = ""; };

template< typename T, const char* S >
struct extract_name< named< T, S > >
{ static constexpr const char* value = S; };
模板
结构提取类型
{使用type=T;};
模板
结构提取类型>
{使用type=T;};
模板
结构提取名称
{static constexpr const char*value=”“;};
模板
结构提取名称>
{static constexpr const char*value=S;};

单靠这一点是不行的,你提供的代码在一些地方是非法的。我在这里修复了它们。

这有助于发布编译后的代码片段。我将对它们进行编辑,以减少损坏,如果它们与你的想法不符,请随时恢复。在检查Daniel的答案后,我自己编辑了它:)@Daimon我想我刚刚意识到“缺失”是什么
typedef
-混淆在于:您只将
typeid()
应用于表达式(变量),而代码中的变量本身是多余的。这也解释了为什么您要求
extract\u type::value
而不是
extract\u type::type
。您知道您也可以应用
typeid()
直接复制到类型?这是我在回答中的实时示例中所做的,另请参见“在实际使用中我使用extract_type只是为了获取类型-在示例中使用typeid只是为了直观地显示我的意思-当然,你是对的,我做错了:),但在目标代码中,它被正确地使用了。关于traits的答案,请再次使用Thx,这有助于发布co删除编译后的代码片段。我将对它们进行编辑以减少损坏,如果它们不符合您的想法,请随意还原。在检查Daniel的答案后,我自己编辑了它:)@Daimon我想我刚刚意识到“缺少”的是什么
typedef
-混淆:您只将
typeid()
应用于表达式(变量),而代码中的变量本身是多余的。这也解释了为什么您要求使用
extract\u type::value
而不是
extract\u type::type
。您知道也可以应用
typeid()
直接到类型?这是我在回答中的实时示例中所做的,另请参见“在实际使用中我使用extract_type只是为了获取类型-在示例中使用typeid只是为了直观地显示我的意思-当然,你是对的,我做错了:)但是在目标代码中它被正确地使用。关于traits的答案,我必须再次阅读你的答案回答理解问题,但假设问题的解决方案很好;-)Thx,必须稍微修改原始问题,但你的特质工作greatI必须阅读你的答案才能理解问题,但假设问题的解决方案很好;-)Thx,必须稍微修改原始问题,但你的特质工作得很好