2011-01-01 12 views
2
template <typename Real> 
class A{ }; 

template <typename Real> 
class B{ }; 
//... a few dozen more similar template classes 

class Computer{ 

public slots: 
void setFrom(int from){ from_ = from; } 
void setTo(int to){ to_ = to; } 

private: 
template <int F, int T> void compute(){ 

    using boost::fusion::vector; 
    using boost::fusion::at_c; 

    vector<A<float>, B<float>, ...> v; 
    at_c<F>(v).operator()(at_c<T>(v)); //error; needs to be const-expression. 
}; 

//... 
computer.compute(1, 3); // ok 
computer.compute(var1, var2); // var1, var2 cannot appear in a constant-expression 

この質問はQtに関するものではありませんが、私の例ではQtコードの行があります。const式へのC++変数

setFrom()およびsetTo()は、GUIウィジェットによるユーザーの選択に基づいて呼び出される関数です。私の問題の根源は、「from」と「to」は変数であるということです。私の計算メンバー関数では、 'from'と 'to'の値に基づいて型(A、Bなど)を選択する必要があります。私がする必要があることをする方法を知っている唯一の方法は、switch文を使うことですが、それは私の場合は非常に面倒です。私は避けたいのです。エラーラインを定数式に変換する方法はありますか?

答えて

1

switchまたはif/elseブロックステートメントを使用しない場合は、このタスクを実行する方法がありません。 at_c<>関数テンプレートはコンパイル時に知る必要のある積分パラメータを取るためです。また、変数to_from_はコンパイル時には分かりません。

そして、次のトピックの私の答え

は何とか、このトピックに関連している:

C++ STL type_traits question


または可能性あなたは派生クラステンプレートを記述することができます(私もよく分かりません)それ自身から、各基底は整数Nの値を減少させ、次にクラステンプレートはNの特定の値に対して関数をディスパッチする。

1

地図に値を入力して別の場所に移入すると、退屈なスイッチステートメントが不要になります。

+2

いいえ、ごめんなさい、助けになりません。マップを埋めることはまだまだ多くの作業です。私は22のテンプレートクラスを持っていますが、すべてのfrom/combosのために、私は400以上のコードブロックで終わります。 – Arlen

関連する問題