質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
メタプログラミング

メタプログラミングとは、プログラミング技法の一つ。プログラムをプログラミングすることを指します。他のプログラムや、そのプログラム自体を操作・出力するメタプログラムを記述する作業をメタプログラミングと呼びます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

解決済

[C++17]あるメンバ関数を持つ型にキャスト可能か調べるメタ関数

ttact
ttact

総合スコア141

メタプログラミング

メタプログラミングとは、プログラミング技法の一つ。プログラムをプログラミングすることを指します。他のプログラムや、そのプログラム自体を操作・出力するメタプログラムを記述する作業をメタプログラミングと呼びます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

3回答

1リアクション

1クリップ

2488閲覧

投稿2019/10/19 05:56

size()メンバ関数を保持するかどうか調べるメタ関数has_sizeを作ります。

C++

namespace { template <typename T> struct has_size_helper { private: template <typename U> static auto test(int) -> decltype(std::declval<U&>().size(), std::true_type()); template <typename U> static auto test(...) -> decltype(std::false_type()); public: using type = decltype(test<T>(0)); }; } template <typename T> struct has_size : has_size_helper<std::remove_reference_t<T>>::type {}; template <typename T> constexpr bool has_size_v = has_size<T>::value;

これを使って型判定を行っていました。

C++

// size()メンバ関数を持っているオブジェクトにだけ呼び出し可能。 template <typename T> bool f(T&&, std::enable_if_t<has_size_v<T>>* = nullptr) { ... }

上記を前提として...
こんなクラスに出会いました。

C++

template <typename T> struct Holder { T entity_; operator T const&() const { return entity_; } };

HolderのTにsize()メンバ関数を持つクラスを指定された状態では、f(Holder<T>())は当然SFINAEで候補から落とされてしまいます。
しかしf()内の実装は、Holder<T>をTにキャストさえできれば問題なく動作するのです。

そしてTやHolderは後から追加される任意の型でも問題ないようにしたいと思います。なので各型に対してオーバーロードしたり特殊化したりはしなくてすむようにしたいです。

上記の条件で、f()がHolder<T>を受け付けられるようにできるものでしょうか?
キャスト先の型を直接指定できない時点で、私の知識では無理なのですが...。

yumetodo👍を押しています

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

メタプログラミング

メタプログラミングとは、プログラミング技法の一つ。プログラムをプログラミングすることを指します。他のプログラムや、そのプログラム自体を操作・出力するメタプログラムを記述する作業をメタプログラミングと呼びます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。