Я хотел бы сгенерировать ошибку компилятора, если используемая программа вызывает метод класса нестандартного шаблона для определенного аргумента шаблона.Как создать ошибку компилятора при попытке создать экземпляр метода подкласса шаблона для определенных значений не-типа?
typedef SubWithTemplate<1> SubWithTemplate1;
typedef SubWithTemplate<2> SubWithTemplate2;
SubWithTemplate1 &subWithTemplate1 = SubWithTemplate1::instance;
SubWithTemplate2 &subWithTemplate2 = SubWithTemplate2::instance;
subWithTemplate1.doSomething(); // Should compile OK
subWithTemplate1.doSomethingElse(); // Should compile OK
subWithTemplate2.doSomething(); // Should NOT compile OK
subWithTemplate2.doSomethingElse(); // Should compile OK
Моя точка является следующие два класса:
Super.h:
class Super {
protected:
Super() {}
public:
virtual void doSomething();
void doSomethingElse();
};
Super.cpp:
void Super::doSomething() {}
void Super::doSomethingElse() {}
SubWithTemplate.h:
template<int SUBNUMBER>
class SubWithTemplate : public Super {
public:
static SubWithTemplate<SUBNUMBER> instance;
void doSomething() {
// Do something
};
private:
SubWithTemplate() : Super() {}
};
template<int SUBNUMBER>
SubWithTemplate<SUBNUMBER> SubWithTemplate<SUBNUMBER>::instance;
Я не очень уверен в Boost или mpl, но у меня есть неопределенное ощущение, что BOOST_MPL_ASSERT может принести мне некоторый успех. Но я не способен понять ничтожество.
Я пытался что-то вроде:
SubWithTemplate.h:
...
void doSomething() {
BOOST_MPL_ASSERT_MSG(<some test on SUBNUMBER being different from 2 and 7 and less than 25>, <what here?>, <what here?>)
};
...
Я не хочу Супер быть Шаблонными, как это должно быть одинаковой конкретизацией для всех подклассов.
Если бы я мог избежать использования виртуального на doSomething, еще лучше.
Я был бы очень благодарен, если бы кто-то из более чем меня-экспертов мог мне помочь.
Предполагая, что вы можете достичь этого (в чем я сомневаюсь), но так как 'йоЗотеЬЫпд()' является виртуальным, как вы можете предотвратить его от вызова через указатель типа 'Супер *' на объект типа ' SubWithTemplate <2> '? Этот вызов обнаруживается только во время выполнения! –
Я думаю, что проблема решена путем удаления виртуального и защиты метода. Но все же экземпляр SubWithTemplate <2> может вызывать его защищенный супер метод. В моем случае это приемлемо, потому что Super не предназначен для наследования пользователем библиотеки, отображается только SubWithTemplate. –