9

次のコードを検討してください。

template<unsigned int... TSIZE>
struct Base {};
template<unsigned int TORDER, unsigned int TDIM>
struct Derived : public Base</* TDIM, TDIM, ... TDIM (TORDER times) */> {};

この例の2行目にBaseのテンプレートパラメータを正しく生成するためのトリックが存在すると思いますか?たとえば、Derived<3, 5>から継承したいBase<5, 5, 5>。どうやってするか ?

4

1 に答える 1

10

少しの TMP があれば、結局、これはそれほど難しくありません。

template<unsigned ToGo, class T, T Arg, template<T...> class Target, T... Args>
struct generate_pack
  : generate_pack<ToGo-1, T, Arg, Target, Args..., Arg>
{ // build up the 'Args' pack by appending 'Arg' ...
};

template<class T, T Arg, template<T...> class Target, T... Args>
struct generate_pack<0, T, Arg, Target, Args...>
{ // until there are no more appends to do
  using type = Target<Args...>;
};

template<unsigned Num, class T, T Arg, template<T...> class Target>
using GeneratePack = typename generate_pack<Num, T, Arg, Target>::type;

template<unsigned int... TSIZE>
struct Base{};

template<unsigned int TORDER, unsigned int TDIM> 
struct Derived
  : GeneratePack<TORDER, unsigned, TDIM, Base>
{
};

実例。

于 2012-08-15T08:41:43.857 に答える