Как использовать интерфейс, чтобы заставить тип * generi c из шаблона в C ++? - PullRequest
4 голосов
/ 20 апреля 2020

Доброе утро, я уже искал несколько вещей, но не могу получить ответ. Я создаю обобщенный класс c, и идея заключается в том, что обобщенный c тип данных (typename T) должен исходить из интерфейса:

это интерфейс:

template<typename T> class iDataType{

public:

   virtual bool writeOnFile(std::fstream& theFile,T& data) = 0;
   virtual T readOnFile(std::fstream& theFile) = 0;

};

И вот что я «пытаюсь» сделать:

template <typename T : public iDataType> class Database{};

спасибо за ваше время.

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

Требование, чтобы T происходило от iDataType<T> в ограниченном контексте вопроса, похоже, не добавляет ценности. Но, чтобы ответить на вопрос в том виде, как я его интерпретирую, свойство, которое вы хотите быть истинным, таково:

std::is_convertible_v<T*, iDataType<T>*>

std::is_base_of вводит в заблуждение, поскольку оно ответит, имеет ли T основание iDataType<T> , но язык требует однозначной базы c для использования T& в качестве iDataType<T>&. Итак, в C ++, когда вы хотите узнать, имеет ли что-то базовый класс в качестве интерфейса, std::is_base_of неверен.

2 голосов
/ 20 апреля 2020

Вы можете утверждать на условии времени компиляции с static_assert, и есть std::is_base_of.

Итак, решение:

template <typename T> class Database{
   static_assert(std::is_base_of<iDataType<T>, T>::value, "should be derived from iDataType");
};

Обратите внимание, что решение для C ++ 11, для более позднего C ++ Standard вы можете использовать std::is_base_of_v и кратко static_assert (без строкового литерала параметр).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...