2016-03-18 5 views
1

Я читал о том, почему методы 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().

ответ

4

Обычное решение такого рода проблемы CRTP:

template < typename TYPE, typename Derived > 
//      ^^^^^^^^^^^^^^^^^^ 
class Reader { 
public: 
    static TYPE getValue() { 
     static TYPE value; 
     static SomeFileClass(Derived::filename, &value, sizeof(value)); 
     //     ^^^^^^^^^ 
     return value; 
    } 
}; 

class OneValue : public Reader<uint16_t, OneValue> { 
//          ^^^^^^^^^^ 
// etc. 
}; 
+0

Ааа, я видел упоминание о том, что в другом вопросе, но не в полной мере понять это в первую очередь. – dwanderson

+0

Теперь это имеет смысл. Удивительно, спасибо, только то, что мне нужно! – dwanderson

Смежные вопросы