У меня есть три класса, config
, circuit
и conn
, которые держат указатели друг на друга, например:
struct config { /* ... */ };
struct circuit {
config *cfg;
/* ... */
};
struct conn {
config *cfg;
circuit *ckt;
/* ... */
}
(Нет контроля доступа и интеллекта указателей, потому что эта программа находится на полпути к конвертации из C в C ++. Это сейчас не важно.)
Когда эти классы подклассы, все три из них всегда подклассы в группе:
struct foo_config : config { /* ... */ };
struct foo_circuit : circuit { /* ... */ };
struct foo_conn : conn { /* ... */ };
Кроме того, это инвариант времени выполнения, когда указатель cfg
в foo_circuit
или foo_conn
будет всегда указывать на экземпляр foo_config
, а указатель ckt
в foo_conn
будет всегда указывать на экземпляр foo_circuit
. В настоящее время это выполняется с dynamic_cast
и утверждениями. В настоящее время есть два разных foo
s, но в будущем их может быть больше.
Можно ли упорядочить вопросы так, чтобы указатели cfg
и ckt
оставались доступными для методов универсальных классов circuit
и conn
и имели там общий тип, но в методах подклассов, эти указатели имеют соответствующий тип подкласса, и приведенный выше инвариант становится принудительным во время компиляции? Если так, то как? Если нет, что бы вы предложили мне сделать вместо этого?
Я предпочитаю ответы, которые минимизируют количество шаблонов, которые я должен написать для каждого набора подклассов. Я также предпочитаю ответы, которые все еще работают, если подклассы определены в анонимном пространстве имен и не видны ни в одном заголовке.