[解決済み] C++で型情報が逆流するのはどんなときか?
2023-02-27 20:17:25
質問
での Stephan T. Lavavej の講演を見たところです。
CppCon 2018
で、quot;Class Template Argument Deduction" について話しました。
ある点
で、彼はついでにこう言っている。
C++では、型情報はほとんど後方には流れない. というのも、1つか2つのケースがあり、もっとあるかもしれませんが、非常に少ないからです。 .
どのようなケースを指しているのか、考えてみたのですが、何も出てきませんでした。そこで質問です。
C++17 標準では、どのような場合に型情報が後方に伝搬することを義務付けていますか?
どのように解決するのですか?
少なくとも1つのケースを紹介します。
struct foo {
template<class T>
operator T() const {
std::cout << sizeof(T) << "\n";
return {};
}
};
とすれば
foo f; int x = f; double y = f;
とすると、型情報が逆流し、何が
T
の中にある
operator T
.
もっと高度な使い方ができます。
template<class T>
struct tag_t {using type=T;};
template<class F>
struct deduce_return_t {
F f;
template<class T>
operator T()&&{ return std::forward<F>(f)(tag_t<T>{}); }
};
template<class F>
deduce_return_t(F&&)->deduce_return_t<F>;
template<class...Args>
auto construct_from( Args&&... args ) {
return deduce_return_t{ [&](auto ret){
using R=typename decltype(ret)::type;
return R{ std::forward<Args>(args)... };
}};
}
で、これで
std::vector<int> v = construct_from( 1, 2, 3 );
で、動作します。
もちろん、なぜ
{1,2,3}
? まあ
{1,2,3}
は式ではありません。
std::vector<std::vector<int>> v;
v.emplace_back( construct_from(1,2,3) );
のように、確かに、もう少し巧妙な操作が必要です。 ライブの例 . (私は、deduce returnにFのSFINAEチェックをさせ、FをSFINAE friendlyにする必要があります。 と deduce_return_t 演算子 T で std::initializer_list をブロックしなければなりません)。
関連
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] オブジェクトの種類を決定しますか?
-
[解決済み] 型チェック:typeof、GetType、is?
-
[解決済み] Pythonで型をチェックする標準的な方法は何ですか?
-
[解決済み】type()とisinstance()の違いは何ですか?)
-
[解決済み】pandasでカラムの種類を変更する
-
[解決済み】<input type="file">でファイル形式を制限する?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み] 配列のベクトルを扱う正しい方法