Рассмотрим два частичных специализаций ниже:Специализации, которые структурно идентичны
#include <iostream>
#include <vector>
#include <type_traits>
template <typename, typename...> struct A;
template <typename... Ts>
struct A<int, Ts...> {
void foo (int a) const {std::cout << a << '\n';}
void operator()(const std::vector<int>& v) const {std::cout << v.size() << '\n';}
};
template <typename... Ts>
struct A<char, Ts...> {
void foo (char a) const {std::cout << a << '\n';}
void operator()(const std::vector<char>& v) const {std::cout << v.size() << '\n';}
};
int main() {
A<int, long, double> a;
A<char, float, bool, short> b;
a.foo(5); // 5
b.foo('!'); // !
a({1,2,3}); // 3
b({1,2,3}); // 3
}
Как написать два специализаций только один раз?
template <typename T, typename... Ts>
struct A<T, Ts...> {
static_assert (std::is_same<T,int>::value || std::is_same<T,char>::value, "Error");
void foo (T a) const {std::cout << a << '\n';}
void operator()(const std::vector<T>& v) const {std::cout << v.size() << '\n';}
};
не работает, потому что ничего не специализироваться, и я не могу поставить class = std::enable_if<std::is_same<T,int>::value || std::is_same<T,char>::value, T>::type
в любом месте, потому что по умолчанию аргумент а не может пойти после обновления. Вышеупомянутые специализации должны быть только для int и char. Любой другой тип будет некоторым другим общим определением для класса.
Переместите идентичную часть в отдельный шаблон, затем используйте наследование. –