C ++ Как создать шаблон класса, который не допускает аргументов шаблона - PullRequest
0 голосов
/ 25 ноября 2018

Я прошу прощения, если мой заголовок сбивает с толку.Я пытаюсь создать шаблон класса, реализующий std :: map с нуля.Чего я хочу добиться, так это не использовать определенные типы данных в аргументах шаблона.Пожалуйста, смотрите код ниже:

#include "pch.h"
#include <iostream>
#include <string>

using namespace std;
template<typename T, typename N>

class MyCustomMap{
    public:
    MyCustomMap();
    T* keys;
    N* values;
};

template<typename T, typename N>
MyCustomMap<T, N>::MyCustomMap(){
    this->keys = new T[10];
    this->values = new N[10];
}
....
....
int main(){
    MyCustomMap<int,string> map; //This works because I specified the argument list
    MyCustomMap map; //This is my goal

    // The main goal is to call Insert one after another with different data types
    map.Insert(1, "Test");
    map.Insert("Test2", 2);

    return 0;
}

Возможно ли это?Любая помощь приветствуется, спасибо.

1 Ответ

0 голосов
/ 25 ноября 2018

MyCustomMap map;

Возможно ли это?

Краткий ответ: нет.

Длинный ответ: если вы передадите какой-то аргумент конструктору

MyCustomMap map{1, "one"};

, возможно вывести int для Tи char const [4] для V.

Но, к сожалению, только начиная с C ++ 17;взгляните на эту страницу для получения дополнительной информации.

Но если вы не передадите аргументы конструктору, вы не сможете вывести аргументы.

РЕДАКТИРОВАТЬ

Точный ОП

// The main goal is to call Insert one after another with different data types
map.Insert(1, "Test");
map.Insert("Test2", 2);

Извините: я неправильно понял ваш вопрос.

Но ответ остается: нет.

C ++ - это скомпилированный и строго типизированный язык.

И шаблонный класс не является классом: это набор классов.

Когда вы создаете экземпляр объекта

MyCustomMap map;

этот объект (map, в данном случае) должен быть объектом точного типа;известна компилятору во время компиляции в этой точной позиции.

Таким образом, вы не можете создать экземпляр map типа, обычно MyCustomMap.Вы должны выбрать пару типов.Может быть, со значениями по умолчанию, может быть вывод типа через аргументы конструктора, возможно использование типа auto и использование типа, возвращаемого функцией, но вы должны выбрать тип при объявлении переменной.Не после.

И, во всяком случае, если вы хотите

map.Insert(1, "Test");  
map.Insert("Test2", 2);

, вам нужен современный объект двух разных типов.

В этом что-то естьнаправление в C ++ 17: ищите std::any и std::variant.Но не такой гибкий.

...