私はstd :: pairのようなクラスを実装しようとしていますが、2つ以上のコンポーネントを実装しようとしています。私のアプリケーションでは、タプルコンポーネントのいくつかはコンパイル時に既に知られていることがあるので、私は以下のスペース最適化をしたいと思います:コンポーネントがコンパイル時定数であることを知っているとき、静的なconst 'メンバ、それは個々のクラスインスタンスでストレージを浪費することはありません。 const修飾子は、実行時に値を変更しようとすると、少なくとも無意味なconst_cast(s)を除外すると、コンパイルエラーが発生することを保証します。コンパイル時定数の最適化
は、私は次の実装、コンパイル時にタグを付けるために使用さntupleクラス
template<typename T0_ = void,
typename T1_ = void,
typename T2_ = void,
typename T3_ = void
> class ntuple;
とクラスになってしまった
template<class type_, type_ value_> class constant
{
typedef type_ type;
static const type value = value_;
};
とntupleクラス
の部分特殊化の束を定数template<typename T0_>
class ntuple<
T0_
> {
public:
static const int n=1;
typedef T0_ T0;
static const bool is_static = false;
static const bool is_static0 = false;
T0_ i0;
};
template<
typename T0_, T0_ value0_
>
class ntuple<
constant<T0_, value0_>
> {
public:
static const int n=1;
typedef T0_ T0;
static const bool is_static = true;
static const bool is_static0 = true;
static const T0_ i0 = value0_;
};
template<
typename T0_, T0_ value0_
> const T0_ ntuple<
constant<T0_, value0_> >::i0;
template<
typename T0_,
typename T1_
>
class ntuple<
T0_,
T1_
> {
public:
static const int n=2;
typedef T0_ T0;
typedef T1_ T1;
static const bool is_static = false;
static const bool is_static0 = false;
static const bool is_static1 = false;
T0_ i0;
T1_ i1;
};
template<
typename T0_,
typename T1_, T1_ value1_
>
class ntuple<
T0_,
constant<T1_, value1_>
> {
public:
static const int n=2;
typedef T0_ T0;
typedef T1_ T1;
static const bool is_static = false;
static const bool is_static0 = false;
static const bool is_static1 = true;
T0_ i0;
static const T1_ i1 = value1_;
};
template<
typename T0_,
typename T1_, T1_ value1_
> const T1_ ntuple<
T0_,
constant<T1_, value1_> >::i1;
template<
typename T0_, T0_ value0_,
typename T1_
>
class ntuple<
constant<T0_, value0_>,
T1_
> {
public:
static const int n=2;
typedef T0_ T0;
typedef T1_ T1;
static const bool is_static = false;
static const bool is_static0 = true;
static const bool is_static1 = false;
static const T0_ i0 = value0_;
T1_ i1;
};
template<
typename T0_, T0_ value0_,
typename T1_
> const T0_ ntuple<
constant<T0_, value0_>,
T1_ >::i0;
template<
typename T0_, T0_ value0_,
typename T1_, T1_ value1_
>
class ntuple<
constant<T0_, value0_>,
constant<T1_, value1_>
> {
public:
static const int n=2;
typedef T0_ T0;
typedef T1_ T1;
static const bool is_static = true;
static const bool is_static0 = true;
static const bool is_static1 = true;
static const T0_ i0 = value0_;
static const T1_ i1 = value1_;
};
template<
typename T0_, T0_ value0_,
typename T1_, T1_ value1_
> const T0_ ntuple<
constant<T0_, value0_>,
constant<T1_, value1_> >::i0;
template<
typename T0_, T0_ value0_,
typename T1_, T1_ value1_
> const T1_ ntuple<
constant<T0_, value0_>,
constant<T1_, value1_> >::i1;
このようにメンバを定数としてタグ付けすると、。>はクラスメンバとして格納されないため、オブジェクトのサイズが小さくなります。 N = 1,2,3,4の場合は2^N、N = 2までしか報告しません。すべてを生成するための簡単なスクリプトを作成しました。クラスは次のように使用できます
ntuple<int, int, bool> tup1;
tup1.i0=2;
tup1.i1=0;
tup1.i2=true;
assert (tup1.i0==2);
assert (tup1.i1==0);
assert (tup1.i2==true);
ntuple<int, constant<int, 3>, constant<bool, false> > tup2;
tup2.i0=2;
// tup2.i1=0; // cannot be assigned, is static a constant
// tup2.i2=true; // cannot be assigned, is static a constant
assert (tup2.i0==2);
assert (tup2.i1==3);
assert (tup2.i2==false);
assert (sizeof(tup1)>sizeof(tup2));
このクラスは完全に機能します。
ntuple<int, int_<3>, bool_<true> >
代わりの
INT_とbool_がtemplate<int i> struct int_ : constant<int, i> {};
template<bool b> struct bool_ : constant<bool, b> {};
または私でしとして定義することができる
ntuple<int, constant<int, 3>, constant<bool, true> >
を次のように今、私はntuplesの宣言 構文を改善したいと思いますboost :: mplアナログを代わりに使用してください。これはポイントではありません。これを実現するには、別のスクリプトを記述し、定数テンプレートパラメータがint_、bool_、char_などの定数および非定数テンプレートパラメータのすべての置換に対してすべての特殊化を生成することです。これは実現可能ですが費用はかかります部分的専門化の数を階乗的に増加させる。
template<typename T0_,
typename T1_,
typename T2_,
typename T3_> class ntuple<T0_,T1_,T2_,T3_,false,false,false,false> { ... };
template<typename T0_,
typename T1_,
typename T2_,
typename T3_> class ntuple<T0_,T1_,T2_,T3_,true,false,false,false> { ... };
などを次のように
template <class T> is_const { static const bool value = false; };
template <int i> is_const<int_<i> > { static const bool value = true; };
template <bool b> is_const<bool_<b> > { static const bool value = true; };
と
template<typename T0_ = void,
typename T1_ = void,
typename T2_ = void,
typename T3_ = void,
bool const0 = is_const<T0_>::value,
bool const1 = is_const<T1_>::value,
bool const2 = is_const<T2_>::value,
bool const3 = is_const<T3_>::value
> class ntuple;
とはntupleを専門と次のように私はntupleクラスの定義を変更することを考えていた。これは、部分の数を減らすことができます前と同じ数の特殊化を行い、それぞれの有効な「定数」型の特性クラスを特化する必要があります。問題は、余分なテンプレートパラメータを避けたいということです。私は
が、その後
template <class T0, class T1, class T2, class T3>
class ntuple : ntuple_impl<T0, T1, T2, T3,
is_const<T0>::value,
is_const<T1>::value,
is_const<T2>::value,
is_const<T3>::value> { ... };
上記のように特化し、補助クラス
template<typename T0_ = void,
typename T1_ = void,
typename T2_ = void,
typename T3_ = void,
bool const0 = is_const<T0_>::value,
bool const1 = is_const<T1_>::value,
bool const2 = is_const<T2_>::value,
bool const3 = is_const<T3_>::value
> class ntuple_impl;
を定義し、継承することによって、これを行うことができますが、私は結果のオブジェクトは、いくつかのケースでは必要以上に大きくなることから、継承を避けたいですそれはサブオブジェクトとしてntuple_implを含むからです。私はこの問題の別の解決策があるかどうかを知っています。ありがとう。 Giuliano
あなたのアンダースコアは私を狂っています。さらに、これは最適化するための良い方法だと確信していますか?私はそれらを生成するスクリプトが必要な場合は、テンプレートポイント全体を見逃していると思います! – vulkanino
私は選択されたデータメンバの前にキーワード 'static'を置く必要があり、 'static'は型の一部ではないので、テンプレートトリックを使ってこれを達成する方法はありません。少なくとも、私は思う...ありがとう! – Giuliano
もっと簡単な方法がある可能性は非常に高いと思うので、達成したいことを説明してください。 –