私は、(同じ概念を共有する)一緒に任意の順序で動作する多くのテンプレートクラスを持っています。ネストされたテンプレートクラスを初期化する
template<typename T>
class A {
T t_;
public:
void call() {
// Do something.
t_.call();
}
};
template<typename T, typename U>
class B {
T t_;
U u_;
public:
void call() {
// Do something.
t_.call();
// Do something.
u_.call();
}
};
class C {
public:
void call() {
// Do something.
}
};
をそして私は、次のインスタンス化されたクラスがあります:
私が持っていると仮定すると
using Foo = A<B<A<C>,C>>;
は、Cは、おそらく動作するように特別なコンストラクタ(または初期化関数)を必要とする、と仮定します。私が実行時に知っているだけのこと。
struct C {
void init(int);
void call();
};
おそらくFooを初期化できますか?または他のネストされたクラスの組み合わせですか?
template<typename I>
struct C {
C() : var_(I::get())
void call();
};
そして、関数の内部ではFooを作成します:
が私の現在の回避策としてCを定義することである
あなたが見int main()
{
int i = 0;
struct HelperC1 {
static int get(bool set = false, int value = 0) {
static int value_ = value;
if (set) value_ = value;
return value_;
}
} helperC1;
struct HelperC2 {
static int get(bool set = false, int value = 0) {
static int value_ = value;
if (set) value_ = value;
return value_;
}
} helperC2;
helperC1.get(true, i);
helperC2.get(true, i+1);
A<B<A<C<HelperC1>>,C<HelperC2>>> foo;
foo.call();
return 0;
}
、この回避策は非常に便利ではありません。別のアプローチは、引数ではFooの最初のコンストラクタを呼び出し、Cにリダイレクトすることですが、これはのような別のクラスの組み合わせのために非常に悪いです:
using Bar = A<B<A<C>,<B<B<A,C>,C>>>;
質問:どのように実行時にネストされた(テンプレート)のクラスを初期化します議論(より良い/より良い、よりクリーンな方法で)?
は "おそらく" あなたは "適切に" を意味するのですか? –
あなたのクラス 'A'と' B'(そしておそらくゲッター)にコンストラクタを与えないのはなぜでしょうか? – Jarod42