C++ 可变模板部分专业化“;“不更专业”;在g++;7.1.1
我有一个相当于std::integer\u序列的代码(我们还没有使用C++14)。我还有两个助手类,它们删除或添加前导数字C++ 可变模板部分专业化“;“不更专业”;在g++;7.1.1,c++,c++11,variadic-templates,template-specialization,C++,C++11,Variadic Templates,Template Specialization,我有一个相当于std::integer\u序列的代码(我们还没有使用C++14)。我还有两个助手类,它们删除或添加前导数字 // Sequence type template <typename Type, Type ... Values> struct Sequence {
// Sequence type
template <typename Type, Type ... Values>
struct Sequence
{
using value_type = Type;
};
// Pop a value off of the start of a sequence
template <class Class>
struct SequencePop;
template <typename Type, Type Value, Type ... Values>
struct SequencePop<Sequence<Type, Value, Values ...>>
{
using type = Sequence<Type, Values ...>;
};
// Push a value on to the start of a sequence
template <class Class, typename Class::value_type Value>
struct SequencePush;
template <typename Type, Type Value, Type ... Values>
struct SequencePush<Sequence<Type, Values ...>, Value>
{
using type = Sequence<Type, Value, Values ...>;
};
g++7.1.1拒绝此代码正确吗?如果正确,如何判断SequencePush
不比主模板“更专业”?应该是这样的
template <typename Type,
Type ... Values,
typename Sequence<Type, Values ...>::value_type Value>
struct SequencePush<Sequence<Type, Values ...>, Value>
{
using type = Sequence<Type, Value, Values ...>;
};
模板
结构序列推送
{
使用类型=序列;
};
由于
Sequence
中的Class::value\u type
和type
不“相关”。事实上,通用模板SequencePush
由一个模板参数(Class
)参数化,但您的专门化由两个参数化(type
和value
)。在常规模板中,类型
不是一个参数,因为它是从类
推导出来的
一个可行但不令人满意的解决方案是:
template <class Class, typename Type, Type Value>
struct SequencePush;
template <typename Type, Type Value, Type ... Values>
struct SequencePush<Sequence<Type, Values ...>, Type, Value>
{
using type = Sequence<Type, Value, Values ...>;
};
模板
结构序列推送;
模板
结构序列推送
{
使用类型=序列;
};
虽然这是可行的,但我不明白为什么OP的原始代码无法编译。至少部分专门化应该更加专门化,因为它包含一个
序列模板类。我遗漏了什么?这比我的尝试要好得多:)@好奇:不确定正确的措辞,但是Type
比Class::value\u Type
(即使它受Sequence
的约束)更专业化, order@Curious:在std::set
和std::vector
之间,或者在Foo
和Foo
之间,哪个更专业?->并非所有元素都具有可比性。那么,Jarod42的答案是否仍然由类型和值参数化?
template <class Class, typename Type, Type Value>
struct SequencePush;
template <typename Type, Type Value, Type ... Values>
struct SequencePush<Sequence<Type, Values ...>, Type, Value>
{
using type = Sequence<Type, Value, Values ...>;
};