cxxrocks
2014-09-03 18:02:21 +08:00
函数调用没见过命名参数的,
模板参数可以做到命名参数
效果
===============
template <class P1 = DefaultP1,
class P2 = DefaultP2>
class Foo{};
不用这个技术,当只需要定制P2时,P1也得被写上。
Foo<DefaultP1, CustomP2>
使用这个技术:
Foo<P2_is<CustomP2> >
实现办法
===============
class Default{
typedef DefaultP1 P1;
typedef DefaultP2 P2;
};
class DefaultArgs : virtual public Default{
};
template <class P>
class P1_is : virtual public Default{
typedef P P1;
};
template <class P>
class P2_is : virtual public Default{
typedef P P2;
};
template <class D, int I>
class Arg: public D{
};
template <class D1, class D2>
class Select : public Arg<D1,1>, public Arg<D2,2>{
};
template <class P1 = DefaultArgs,
class P2 = DefaultArgs>
class Foo{
public:
typedef Select<P1,P2> Selection;
};
预期结果
===============
std::is_same < typename Foo<P2_is<Bar> >::Selection::P2, Bar >::value == true
来自《C++ Templates》 16.1