0

テンプレートタイプにプロパティを要求する方法はありますか?

例えば:

template <typename T, typename U>
void foo()
{
    U a,b;
    bool truthiness = T()(a,b);
    if (truthiness)
        // do something
}

では、特定のタイプを返す定義済みTのをどのように要求しますか?operator()(U a, U b)これは可能ですか?(私はそれがdにあることを知っていますが、c ++についてはよくわかりません)。

ps。ここでダックタイピングが間違っている場合は、私に知らせてください。それは正しいと思いますが、よくわかりません。

4

3 に答える 3

4

あなたの意図を考えると、あなたの構文は間違っています。Tは型であるため、2 つのパラメーターのコンストラクターを使用してT(1, 2)型の一時オブジェクトを構築します。s オペレーターTを呼び出したい場合は、次のようにする必要があります。T()

T()(1, 2);

あなたの目的のために一時的な作品を介した呼び出しを想定しています。

Tそのような operator がない場合()、コードは単にコンパイルに失敗します。テンプレート コードの大きな利点の 1 つは、構文が有効である限り (つまり、あなたが話しているまさにダックタイピング) 限り "機能する" ことですoperator ()。現在。

もちろん、私の例ではT = void (*)(int, int)、コードは構文的に有効ですが、null ポインターを介した関数呼び出しになるため、実際には意味があるかもしれません。Tしかし、繰り返しになりますが、これはコードの私のバージョンに固有のものであり、演算子を適用したいタイプの特定のオブジェクトがわかりません()

そうは言っても、Boost ライブラリには、そのようなプロパティをチェックし、テンプレートのメタプログラミングや静的アサーションでの分岐に使用できる機能がかなりあることは何の価値もありません。

于 2012-06-30T00:00:58.730 に答える
2

テンプレートを単純に表現すると、T に が必要になりますoperator()(int, int)。そうしないとコンパイルされません。

ただし、API を作成していて、API のユーザーに互換性のない型が渡されたことを通知したい場合は、演算子を検出する型特性を作成する必要があり、関数を特殊化してその事実を識別し、 static_assert で事実を示します。

于 2012-06-29T23:55:22.657 に答える
0

decltypeにアクセスできる場合は、比較的簡単に独自のチェックを実行できます。

template <class T, class U> class check_same_type_t;

template <class T> class check_same_type_t<T, T> { };

template <class T, class U>
void foo()
{
    U a,b;
    check_same_type_t<bool, decltype(T()(a, b))> check;
    bool truthiness = T()(a,b);
    if (truthiness) ;
        // do something
}

これにより、次のことが可能になります。

struct A {
    bool operator()(int, int) { return true; }
};

struct B {
    int operator()(int, int) { return 1; }
};

int
main()
{
    foo<A, int>(); // will compile
    foo<B, int>(); // won't compile

}

これが本当に欲しいものであることを確認してください。汎用アルゴリズムに特定のタイプを使用するように強制すると、問題が発生する可能性があります。型が暗黙的にboolに変換可能である場合、条件で使用するのが不十分なのはなぜですか?

于 2012-07-03T04:38:07.913 に答える