7

テンプレート パラメータは、次のように、それに続く別のテンプレート パラメータで使用できます。

template<typename T, T N>
struct s
{
};

しかし、「N」の後に宣言されている場合、「T」を参照することは可能ですか?

これは動作しません :

template<T N, typename T>
struct s
{
};

「T」を事前に宣言するか、何か他のことを行うことで、コンパイラを支援できますか?

事前に感謝します。

編集 : 最初の 2 つの返信は、「なぜそれをする気があるのですか?」と尋ねていました。目標を説明します:

テンプレート化されたクラスを簡単に使用できるようにするために、コンパイラに型 "T" を推論させたいと考えています。

例えば ​​:

template<typename T, T A, T B>
struct sum
{
    static T const value = A + B;
};

このテンプレートは次のように使用できます。

sum<int, 1, 2>::value

しかし、次のように使用できればより良いでしょう:

sum<1, 2>::value

技術的には、コンパイラは "1" と "2" : "int" の型を認識しており、実際にはこれらの情報を使用して関数の最適なオーバーロードを見つけるため、可能であるはずです。したがって、このようにテンプレートを宣言することにより:

template<T A, T B, typename T>
struct sum
{
    static T const value = A + B;
};

コンパイラはその機能を使用して、最初と 2 番目のパラメーターによって提供される情報から最後のパラメーターを推測し、インスタンス化するのに最適なテンプレートを見つけることができます。

4

3 に答える 3

8

他の人が言うように - いいえ、これは不可能です。コンパイラはT、非型のテンプレート引数からの型を推測できません (関数の場合、関数の引数から型を推測します):

14.8.2.4/12:

非型テンプレート引数の型からテンプレート型引数を推定することはできません。

いずれにせよ、クラス テンプレートの引数については推論は行われません。関数テンプレートの例は次のとおりです。

template<int> struct having_int { };
template<typename T, T i> void f(having_int<i>);
int main() { having_int<0> h; f(h); }

この場合、は次のTように推測されませんint- 明示的に指定する必要があります。

于 2009-09-19T00:45:47.120 に答える
0

私はあなたの質問を適切に読んでいなかったので、以下はゴミです。

確かに、あなたが達成しようとしていることにも何の意味もありません。

#include <iostream>

template<typename T, T N>
struct s
{
    T size() { return N; }
};


int main()
{
    s<int, 4> x;
    std::cout << x.size()<< '\n';

    //s<float, 3.14> f; //this doesn't compile
}

これは、GCC と Comeau Online でコンパイルできます。

問題は、使用しようとしている T のタイプにあると思います。非型テンプレート引数は整数型のみをサポートし、外部リンケージを持つオブジェクトへのポインター (またはそのようなもの、およびおそらく他のいくつかの非常に制限されたもの) をサポートします。

于 2009-09-18T22:54:58.313 に答える
0

できません。なぜあなたもそうしているのか意味がわかりません。

于 2009-09-18T22:50:16.727 に答える