4

1 ~ 8 個の整数引数を受け入れるテンプレート クラスがあります。各引数の許容範囲は 0..15 です。各引数のデフォルト値 16 により、未使用の引数を検出できます。

ユーザー指定の引数の数をコンパイル時の定数として使用できるようにしたいと考えています。これは、テンプレート ヘルパー クラスと多くの部分的な特殊化を使用して行うことができます。

私の質問は、少し再帰的なメタプログラミングを使用してこれをクリーンアップできるかどうかです。私が持っているものは機能しますが、構文的に改善できるように感じます。

悲しいことに、可変個引数テンプレートやその他の c++0x は利用できません。

#include <stdint.h>
#include <iostream>

template<uint8_t p0,uint8_t p1,uint8_t p2,uint8_t p3,uint8_t p4,uint8_t p5,uint8_t p6,uint8_t p7>
struct Counter { enum { COUNT=8 }; };

template<uint8_t p0,uint8_t p1,uint8_t p2,uint8_t p3,uint8_t p4,uint8_t p5,uint8_t p6>
struct Counter<p0,p1,p2,p3,p4,p5,p6,16> { enum { COUNT=7 }; };

template<uint8_t p0,uint8_t p1,uint8_t p2,uint8_t p3,uint8_t p4,uint8_t p5>
struct Counter<p0,p1,p2,p3,p4,p5,16,16> { enum { COUNT=6 }; };

template<uint8_t p0,uint8_t p1,uint8_t p2,uint8_t p3,uint8_t p4>
struct Counter<p0,p1,p2,p3,p4,16,16,16> { enum { COUNT=5 }; };

template<uint8_t p0,uint8_t p1,uint8_t p2,uint8_t p3>
struct Counter<p0,p1,p2,p3,16,16,16,16> { enum { COUNT=4 }; };

template<uint8_t p0,uint8_t p1,uint8_t p2>
struct Counter<p0,p1,p2,16,16,16,16,16> { enum { COUNT=3 }; };

template<uint8_t p0,uint8_t p1>
struct Counter<p0,p1,16,16,16,16,16,16> { enum { COUNT=2 }; };

template<uint8_t p0>
struct Counter<p0,16,16,16,16,16,16,16> { enum { COUNT=1 }; };


template<uint8_t p0,uint8_t p1=16,uint8_t p2=16,uint8_t p3=16,
         uint8_t p4=16,uint8_t p5=16,uint8_t p6=16,uint8_t p7=16>
struct MyClass {

  void printArgCount() {
    std::cout << Counter<p0,p1,p2,p3,p4,p5,p6,p7>::COUNT << std::endl;
  }
};


main() {
  MyClass<4,7,8,12,15,1> foo;

  foo.printArgCount();
}
4

3 に答える 3