Просто ради удовольствия я пытаюсь перегрузить struct
, один для std::array<T,SIZE>
, один для std::vector<T>
и std::unordered_map<T,U>
. Поэтому я сделал следующее:
template<typename... T>
struct Cont;
template<typename T, std::size_t SIZE>
struct Cont<T,SIZE>
{
Cont(std::string n) : name(n){}
std::string name;
std::array<T,SIZE> array;
};
template<typename T>
struct Cont<T>
{
Cont(std::string n) : name(n){}
std::string name;
std::vector<T> vector;
};
template<typename T, typename U>
struct Cont<T,U>
{
Cont(std::string n) : name(n){}
std::string name;
std::unordered_map<T,U> unordered_map;
};
Однако, когда я пытаюсь его скомпилировать, я получаю ошибку expected a type, got SIZE
. Что я полностью понимаю, так это то, что typename... T
ожидает тип, а не std::size_t
. Итак, я попробовал:
template<std::size_t SIZE, typename... T>
struct Cont;
template<typename... T>
struct Cont;
Что также не работает, так как я переопределяю и не перегружаю, как я изначально думал, что делал. Я также понимаю, что я могу сделать:
template<std::size_t SIZE, typename... T>
struct Cont;
Однако я стараюсь сохранить это как можно более чистым в том смысле, когда я объявляю их, я хочу быть в состоянии сделать:
int main()
{
Cont<int,5> myArray("myArray");
myArray.array = {1,2,3,4,5};
Cont<int> myVector("myVector");
myVector.vector = {1,2,3,4};
Cont<int,int> myMap("myMap");
myMap.unordered_map[0] = 2;
}
Есть ли способ перегрузить шаблон? (Я предполагаю, что это не так) или создать шаблон таким образом, что я либо typename... T
или typename T, std::size_t SIZE
?