用户通过定义指定所需选项的类来定制库模板类。称其为清单。这个想法是在清单中有可选的 typedef。例如,如果用户的清单包含 H 的 typedef,我希望库代码使用指示的类型作为其“H”。如果用户清单中没有 typedef,则库将使用默认值。
我怀疑有一种优雅的方法可以利用新的 C++11 特性来做到这一点,但我的想法是空的。我有一个基于 SFINAE 的 Wikipedia 条目的解决方案。这是丑陋的。对于每个新的 H ,它都需要一个新的模板函数has_typedef_H。我隐约感到不安的是,它利用了0可以表示整数或空指针的属性。只是看起来太笨拙了。
有没有更好的办法?最好是可以在 VC++ 2010 中使用的?
在玩具示例中,有五个类,H1、H2 和 U0、U1 和 U2。H1 和 H2 是库类 L 的“助手”示例。H1 是默认值。U 是用户定义类的示例。在示例中,我省略了定义库类 L,仅使用 main() 的主体根据 U 中的 typedef(或缺少该类型定义)来选择 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;
}