我想通过非模板类专门化一个带有可变参数模板模板参数的模板类。请参阅下文。
// non-template base class
class BaseNoneTemplate {
public:
void print(void) {
std::cout << "BaseNoneTemplate" << std::endl;
}
};
// template base class
template <typename T>
class BaseTemplate {
public:
void print(void) {
std::cout << "BaseTemplate" << std::endl;
}
};
// primary template class
template <template <typename...> class T_Self, typename... T_Params>
class VariadicTemplate : public T_Self<T_Params...> {
public:
VariadicTemplate() = default;
virtual ~VariadicTemplate() = default;
void print(void) {
this->T_Self<T_Params...>::print();
}
};
// specialized class with a non-template class
// ********** This specialized class makes an error: see the error message at the end of this question ***********
template <>
class VariadicTemplate<BaseNoneTemplate> : public BaseNoneTemplate {
public:
VariadicTemplate() = default;
virtual ~VariadicTemplate() = default;
void print(void) {
this->BaseNoneTemplate::print();
}
};
// specialized class with an template class
// ***** This class is an ok example *****
template <typename T_Value>
class VariadicTemplate<BaseTemplate, T_Value> : public BaseTemplate<T_Value> {
public:
VariadicTemplate() = default;
virtual ~VariadicTemplate() = default;
void print(void) {
this->BaseTemplate<T_Value>::print();
}
};
void test_variadic_template(void) {
VariadicTemplate<BaseNoneTemplate> non_template;
VariadicTemplate<BaseTemplate, int> an_template;
non_template.print();
an_template.print();
}
在上面的代码中,我无法通过非模板类BaseNoneTemplate使用可变参数模板模板参数来专门化模板类。 有人知道如何使用非模板类专门化它吗?
编译器的错误如下,
../template_template_variadic.hpp:44:40: error: type/value mismatch at argument 1 in template parameter list for ‘template<template<class ...> class T_Self, class ... T_Params> class VariadicTemplate’ class VariadicTemplate<BaseNoneTemplate> : public BaseNoneTemplate {
^
../template_template_variadic.hpp:44:40: note: expected a class template, got ‘BaseNoneTemplate’
非常感谢。
答案 0 :(得分:1)
如何添加另一层泛化?
//...
template <typename... Types>
class VariadicTemplate;
// primary template class
template <template <typename...> class T_Self, typename... T_Params>
class VariadicTemplate<T_Self<T_Params...>, T_Params...>: public T_Self<T_Params...> {
//...
};
//...
void test_variadic_template(void) {
VariadicTemplate<BaseNoneTemplate> non_template;
VariadicTemplate<BaseTemplate<int>, int> an_template;
non_template.print();
an_template.print();
}
我删除了我没有改变的部分。此代码不能在MSVC2015上编译,但原因不明。我已经提交了bug,但如果您使用它,那么它很快就无法帮助您。
此版本适用于MSVC(除了更简洁和干净):
template <typename... Types>
class VariadicTemplate;
//..
template <template <typename...> class T_Self, typename... T_Params>
class VariadicTemplate<T_Self<T_Params...>>: public T_Self<T_Params...> {
//...
}
//...
void test_variadic_template(void) {
VariadicTemplate<BaseNoneTemplate> non_template;
VariadicTemplate<BaseTemplate<int>> an_template;
non_template.print();
an_template.print();
}
答案 1 :(得分:1)
如果您的VariadicTemplate
期望template <typename...> class, typename...
作为模板参数,则无法将其专门用于类型。
您可以做的是期望类型并专门针对特定类型或(部分)专门针对来自模板类型的类型。
template <typename T> class VariadicTemplate;
// Partial specialization
template <template <typename...> class C, typename... Ts>
class VariadicTemplate<C<Ts...>> : public C<Ts...> {
public:
void print() { C<Ts...>::print(); };
// or using C<Ts...>::print;
};
// Full specialization
template <>
class VariadicTemplate<BaseNoneTemplate> : public BaseNoneTemplate {
public:
void print() { BaseNoneTemplate::print(); };
// or using BaseNoneTemplate::print;
};