7

テンプレート関数があるとしましょうassign()。ポインターと値を取り、その値をポインターのターゲットに割り当てます。

template <typename T> void assign(T *a, T b) { *a = b; }

int main() {
    double i;
    assign(&i, 2);
}

この場合、私は常にT最初の引数から推測されたいと思っていますが、これをうまく表現できていないようです。2のタイプは ですint

deduce.cpp:5:5: エラー: 'assign' の呼び出しに一致する関数がありません
    割り当てます (&i, 2);
    ^~~~~~
deduce.cpp:1:28: 注: 候補テンプレートは無視されました: パラメータ 'T' ('double' と 'int') の競合する型を推測しました
template void assign(T *a, T b) { *a = b; }

assign()2 番目の引数がテンプレート パラメーターの推論に参加しないように宣言できる方法はありますか?

4

8 に答える 8

3

2が typeintに推定されるだけで、 によって推定されるテンプレート パラメーターと一致しません&i。値を double として使用する必要があります。

assign(&i, 2.0);
于 2013-07-02T18:27:29.227 に答える
0

decltypeまたは、 2 番目の引数を最初の型に型キャストするために使用できます。

template <typename T> void assign(T *a, T b) { *a = b; }

int main() {
    double i;
    assign(&i, (decltype(i))2);
}
于 2013-07-02T22:38:22.443 に答える
0

C++20 にはstd::type_identity、非推定コンテキストを確立するために使用できるものがあります。

#include <type_traits>

template <typename T>
void assign(T *a, std::type_identity_t<T> b) {
    *a = b;
}

int main() {
    double i;
    assign(&i, 2);
}

デモ

于 2020-03-26T07:53:00.683 に答える
0

どうやらstd::identityもうありません (標準ライブラリに std::identity がない理由はありますか? )

ただし、関数を呼び出すときに、パラメーターの型リストでパラメーターの型を指定できます。

template <typename T> void assign(T *a, T b) { *a = b; }

int main() {
  double i;
  assign<double>(&i, 2);
}

このようにして、コンパイラは整数の入力引数を double に変換して関数テンプレートに一致させます。引数の推定は行われません。

ライブデモ

于 2016-12-02T02:52:18.480 に答える