2017-01-04 21 views
0

Есть ли способ разбить круговые зависимости, такие как следующие, не перемещая как алиасы using/typedef вне классов?C++ циклическая зависимость от общедоступных псевдонимов (typdef/using), определенных внутри класса/структуры

// header A.h 
#ifdef A 
#define A 
#include "B.h" 
class A { 
    using ID = uint32_t; 
    void some_func(B::ID id); 
}; 
#endif A 


// header B.h 
#ifdef B 
#define B 
#include "A.h" 
class B { 
    using ID = uint64_t; 
    void some_func(A::ID id); 
}; 
#endif B 


// main.cpp 
#include "A.h" 
int main() {...} 

Предположим, защитные #ifdef ы присутствуют и идентификатор может быть более сложным типом (а struct и т.д.).

Редактирование: немного разъяснений: псевдонимы не обязательно одинаковы (то есть не ID).

Модифицированный пример:

// header A.h 
#ifdef A 
#define A 
#include "B.h" 
class A { 
    using SomeAliasInA = uint32_t; 
    void some_func(B::SomeAliasInB id); 
}; 
#endif A 


// header B.h 
#ifdef B 
#define B 
#include "A.h" 
class B { 
    using SomeAliasInB = std::string; 
    void some_func(A::SomeAliasInA id); 
}; 
#endif B 

ответ

0

Создание внешнего файла для определения типа:

template<typename T> 
struct types{}; 

class A; 
class B; 

template<> 
struct types<A>{ 
    using alias = std::string; 
}; 

template<> 
struct types<B>{ 
    using ID = bool; 
    using alias_2 = int; 
    using alias_3 = short; 
}; 

Вы можете использовать его так:

class A{ 
    void foo(types<B>::ID id); 
}; 
class B{ 
    void foo(types<A>::alias id); 
}; 
+0

Спасибо за ответ. Ваше решение кажется разумным, если псевдонимы имеют одинаковое имя. Я уточнил вопрос с разъяснением. –

+0

@JimmyBazooka Тот же ответ применяется, вы можете иметь столько typedef или псевдонимов, сколько хотите в struct 'types'. – Quest