如何通过使用可变模板参数来专门化元组的类模板?

Posted

技术标签:

【中文标题】如何通过使用可变模板参数来专门化元组的类模板?【英文标题】:How to specialize a class template for a tuple by using variadic template arguments? 【发布时间】:2013-10-03 03:02:19 【问题描述】:

如何为一个元组专门化一个类模板?我尝试以下但失败了。我正在使用 VC Compiler Nov 2012 CTP,它支持可变参数模板参数。

template<class T>
struct A

   void f() 
;

template<class... Args>
struct A<tuple<Args...>>

   void g() 
;

我试试

A<tuple<int, float>> a;
a.g(); // error error C2039: 'g' : is not a member of 
//'A<std::tuple<int,float,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>>

感谢 yngum。这可能是一个 VC 编译器错误。如果是这样,如何解决?

【问题讨论】:

编译器错误。 error C2039: 'g' : is not a member of 'A&lt;std::tuple&lt;int,float,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil&gt;&gt; @yngum 是的。但它不适用于 VC CTP 编译器。这是编译器的错误吗? @user1899020 VC 不喜欢可变参数模板,很可能是一个错误。 重新标记,因为它是特定于平台的错误。 【参考方案1】:

这是一个编译器错误。作为一种解决方法,只需添加 2 参数专业化

template<class Arg0, class Arg1>
struct A< std::tuple<Arg0, Arg1> >

   void g() 
;

Live Example.

是的,您必须为代码可能使用的尽可能多的参数执行此操作。或者,您可以尝试VS 2013 RC,它可能已修复此错误。

更新:我现在看到您向a separate question 询问了解决方法。那里发布了相同的解决方案。

【讨论】:

以上是关于如何通过使用可变模板参数来专门化元组的类模板?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C++11 可变参数模板来定义由向量元组支持的元组向量?

如何将元组扩展为可变参数模板函数的参数?

从元组生成元组

是否可以 NATVIS 递归元组(可变参数模板)?

可变参数模板

Python不可变对象元组(tuple)详解