[解決済み] std::result_ofとdecltypeの違いについて
2022-11-14 14:39:31
疑問点
の必要性を理解するのに苦労しています。
std::result_of
の必要性を理解するのに苦労しています。私が正しく理解していれば
result_of
は、ある種のパラメータを持つ関数オブジェクトを呼び出したときの結果の型を取得するために使用されます。たとえば
template <typename F, typename Arg>
typename std::result_of<F(Arg)>::type
invoke(F f, Arg a)
{
return f(a);
}
次のコードとの違いがよくわからない。
template <typename F, typename Arg>
auto invoke(F f, Arg a) -> decltype(f(a)) //uses the f parameter
{
return f(a);
}
または
template <typename F, typename Arg>
auto invoke(F f, Arg a) -> decltype(F()(a)); //"constructs" an F
{
return f(a);
}
この2つの解決策で考えられる唯一の問題は、どちらかが必要であるということです。
- decltypeに渡される式で使用するために、ファンクタのインスタンスを持っている。
- ファンクタに定義されたコンストラクタを知っている。
との唯一の違いは
decltype
と
result_of
は、最初のものが式を必要とするのに対して、2番目は必要ないということでしょうか?
どのように解決するのですか?
result_of
は
で導入されたBoost
で導入され、その後
が TR1 に含まれるようになりました。
となり、最後にC++0xに収録されました。したがって
result_of
は後方互換性があるという利点があります (適切なライブラリがあれば)。
decltype
は C++0x では全く新しいもので、関数の戻り値型にのみ制限されるものではなく、言語機能です。
とりあえず、gcc 4.5で。
result_of
が実装されているのは
decltype
:
template<typename _Signature>
class result_of;
template<typename _Functor, typename... _ArgTypes>
struct result_of<_Functor(_ArgTypes...)>
{
typedef
decltype( std::declval<_Functor>()(std::declval<_ArgTypes>()...) )
type;
};
関連
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] 私的相続、公的相続、保護相続の違いについて
-
[解決済み] C++11の'typedef'と'using'の違いは何ですか?
-
[解決済み] constexpr` と `const` の相違点
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】'cout'は型名ではない
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む