【发布时间】:2011-10-01 17:32:06
【问题描述】:
出于愚蠢的原因,我不会在这里讨论,我需要注释掉的行才能工作,而它上面的行不能工作:
template<uint _N, typename... _Args>
struct PartialTuple;
template<uint _N, typename _Arg, typename... _Args>
struct PartialTuple<_N, _Arg, _Args...>: PartialTuple<_N-1, _Args...> {};
template<typename _Arg, typename... _Args>
struct PartialTuple<0, _Arg, _Args...>
{
typedef std::tuple<_Arg, _Args...> type;
};
int main()
{
// I want this to not work...
PartialTuple<1, std::string, std::string, int, int>::type A{"test", 5, 1};
// I want this to work...
//PartialTuple<1, std::string, std::string, int, int>::type B{"test", "test", 5};
}
我尝试将_Arg 与_Args... 交换,但这不会编译(至少在 GCC 4.6 中):
error: parameter pack argument ‘_Args ...’ must be at the end of the template argument list
如何从尾部而不是头部拉出物品?
【问题讨论】:
-
我想你可以编写一个 veriadic 模板构造函数,并编写一个
Expand辅助对象,如果大小太小,它会附加默认构造的对象,然后将整个 shebang 转发到另一个刚刚初始化的构造函数一切正常。 -
快速备注:以
_[A-Z]开头的标识符在所有范围内都是保留的,您的代码不符合标准。 -
很高兴知道,我会改变它。我从查看 STL 标头中养成了这个习惯,这可能是个坏主意。
-
@Sydius 确实是个坏主意,因为各种类型的保留标识符都是为标准库和其他实现细节保留的用于......此外,任何标准库实现并不意味着被视为示例代码(它希望具有示例的正确性/性能,但出于多种原因,它的风格不是用户应该模仿的)
标签: c++ c++11 variadic-templates