我正在寫一個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在沒有宏的情況下一次定義多個 s,那就太好了。
uj5u.com熱心網友回復:
只需使用函式宣告。您無需定義它們,可以輕松提取引數型別,可以毫無問題地重復前向宣告,并免費獲得 ADL。
void dependency(A, B, C, D); // A depends on B, C, D
或者,如果它更容易使用
std::tuple<B, C, D> dependency(A);
您需要使用 SFINAE 來處理沒有依賴關系的類,或者有一個特殊的保證最差匹配
NoDepTagType dependency(...);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/529532.html
標籤:C 模板脊骨增强预处理器
上一篇:模板中的部分屬性
