如何在c++中存储和处理可能重复的分布式类耦合信息?



我在写一个template<class ...Ts> class SortedTypeHolder。在编译时实例化过程中,SortedTypeHolder必须从它们的头文件中收集有关所有...Ts的分布式信息,以便将来进行排序。收集到的信息以template<typename A, typename B> class Pair专门化的形式描述了哪些类依赖于其他类。我想用宏DEFINE_PAIRS一次为一个依赖类提供多个依赖。

#include <boost/preprocessor.hpp>
template<class ...Ts> class SortedTypeHolder;
template<typename Depender, typename Dependee>
class Pair : std::false_type {}; //doesn't depend, the default
#define TRUESPEC( _, Depender, Dependee ) 
template<> class Pair<Depender, Dependee> : public std::true_type {}; //depends
#define DEFINE_PAIRS( Depender, ... ) 
   BOOST_PP_LIST_FOR_EACH( TRUESPEC, Depender, BOOST_PP_TUPLE_TO_LIST( ( __VA_ARGS__ ) ) )
class A {};
class B {};
class C {};
class D {};
// from A.hpp
DEFINE_PAIRS( A, B, C, D )
// from B.hpp
DEFINE_PAIRS( B, A, C, D )
// from D.hpp. this dependency is reverse yet allowed
//DEFINE_PAIRS( A, D )     //Error C2766 explicit specialization; 'Pair<A,D>' has already been defined
...
SortedTypeHolder<A,B,C,D> holder;

我还希望我的代码允许重复依赖而不生成新的专门化,但是我当前的实现在这种情况下会产生错误。请给我一个建议,我如何增强代码,以允许重复的依赖关系。如果可以在没有宏的情况下一次定义多个Pair,那就太好了。

只使用函数声明。您不需要定义它们,可以很容易地提取参数类型,可以毫无问题地重复前向声明,并免费获得ADL。

void dependency(A, B, C, D); // A depends on B, C, D

或者,如果用

更方便的话
std::tuple<B, C, D> dependency(A);

你需要使用SFINAE来处理没有依赖的类,或者有一个特殊的保证最差匹配

NoDepTagType dependency(...);

相关内容

  • 没有找到相关文章

最新更新