用戶通過定義指定所需選項的類來定製庫模板類。稱之爲清單。這個想法是在清單中有可選的typedef。例如,如果用戶的清單包含H的typedef,我希望庫代碼使用指定的類型作爲其「H」。如果用戶清單中沒有typedef,庫將使用默認值。C++如何通過可選的typedef使用SFINAE或其他來選擇類
我懷疑有一個優雅的方式來利用新的C++ 11功能來做到這一點,但我現在空了。我有一個解決方案,基於SFINAE的維基百科條目。這是醜陋的。它需要一個新的模板功能has_typedef_H對於每個新的H.我含糊其辭地認爲它利用了可以指整數或空指針的屬性。只是似乎太糟糕了。
有沒有更好的方法?最好能用VC++ 2010工作嗎?
在玩具的例子中有H1,H2,U0,U1和U2五類。 H1和H2是庫類L的「助手」的例子。H1是默認值。 U是用戶定義的類的示例。在這個例子中,我省略了定義庫類L,只是使用main()的主體來根據U中的typedefs(或缺少)來選擇H。 H2類型的主題。
struct H1{
void operator()(){ std::cout << "H1" << std::endl;}
};
struct H2{
void operator()(){ std::cout << "H2" << std::endl;}
};
struct default_H: public H1 {};
struct U2 {
typedef H2 H;
};
struct U1 {
typedef H1 H;
};
struct U0 {
};
template <typename T>
class has_typedef_H {
typedef char no[false+1];
typedef char yes[true+1];
template
static yes& test(typename C::H*);
template
static no& test(...);
public:
static const bool value = sizeof(test(0))-1;
};
template<typename U, bool >
struct type_H_B: public default_H{};
template<typename U>
struct type_H_B<U, true>: public U::H {};
template<typename U>
struct H_type: public type_H_B<U, has_typedef_H<U>::value> {};
int main() {
H_type<U0> h0;
H_type<U1> h1;
H_type<U2> h2;
// Prints H1 H1 H2
h0();
h1();
h2();
return 0;
}
這兩項的解決方案發生在我身上。我不太喜歡從一類默認值中派生出來,因爲在典型情況下,用戶甚至不需要知道這些東西。 「清單」只是一個函數對象,實現了他想要最小化的多元函數。自從我使用#macros以來,我已經忘記了如何將字符串拼湊在一起。 :-)直到下一組很酷的功能被添加到C++(C++ 25?),這可能是最好的。甚至可能在之後。 – 2012-08-09 04:18:39
另一個解決方案,也許最好的方法是使用type_traits的方式。這是非侵入性的。但是這個答案並沒有解決這個難題。我愛拼圖。 – 2012-08-09 04:30:21
@JiveDadson:第一種方法*是* type_traits方法。這個類型被傳遞給一個提取特徵的函數,它可以是一個默認類型,也可以是嵌套類型......在等待新標準時,如果* static if *前進,這可能是一個選項,但關於這個特定問題我不認爲它會增加除簡單語法之外的任何其他內容。一切(我相信),可以通過濫用繼承來解決* static中的* static *。 – 2012-08-09 04:36:27