我在写一个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(...);