Я читал о том, почему методы static virtual
не имеют никакого смысла - либо функция virtual
, поэтому она может быть переопределена реализацией, или это static
, потому что тип известен во время компиляции, и это не могут быть обоим. Я интересно, если есть способ сделать то, что я пытаюсь:C++ статические подклассы шаблонов
Я имею ту же базовую структуру для чтения в некоторых предварительно настроенных значениях:
// in some header
template < typename TYPE >
class Reader {
public:
static TYPE getValue() {
static TYPE value;
static SomeFileClass(filename, &value, sizeof(value));
return value;
}
};
class OneValue : public Reader<uint16_t> {
public:
static const char* filename;
};
// and maybe OtherValue : public Reader<SomeUserType> {}; etc etc.
// in main.cpp, for example
const char* OneValue::filename = "onevalue.txt";
Это, а также различные вариации этого, потерпеть неудачу. Сначала он сказал, что filename
не был объявлен в Reader
, который звучит разумно; поэтому я объявил там static const char* filename
с планом намеренного затенения Reader::filename
с OneValue::filename
, потому что, когда я его использую позже, я позвоню OneValue::getValue()
. Я знаю тип, когда я его вызываю.
Однако это не работает, потому что Reader::filename
не определен, но когда я его определяю, он говорит, что шаблон используется без параметров шаблона`, который также звучит как разумная ошибка, но теперь у меня нет идей.
Есть ли способ сделать то, что я хочу, без большого количества кодовых копий? Я открыт для совершенно новых формулировок, просто хочу, чтобы это было четким и кратким - код выше, в то время как он имеет надуманные имена, на самом деле является целым классом Reader
, который я надеялся реализовать, поэтому переопределяю примерно getValue()
в каждом производный класс - это больше работы, чем хотелось бы, так как для каждого класса потребуется больше строк для вывода и переопределения, а не для переопределения getValue()
.
Ааа, я видел упоминание о том, что в другом вопросе, но не в полной мере понять это в первую очередь. – dwanderson
Теперь это имеет смысл. Удивительно, спасибо, только то, что мне нужно! – dwanderson