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

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

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

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

C++

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

解決済

インスタンスかどうかを区別するクラスの非型バージョンを作りたい

fluid_love
fluid_love

総合スコア21

メタプログラミング

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

C++

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

1回答

0リアクション

0クリップ

894閲覧

投稿2021/05/02 07:34

前提

インスタンスであるかどうかを判定するクラスがあります(参考).

cpp

template<typename T, template <typename ...> typename U> class is_instance_of { private: template<typename V> class helper : public std::false_type {}; template<typename... V> class helper<U<V...>> : public std::true_type {}; public: static constexpr bool value = helper<T>::value; };

これを用いると

cpp

#include <iostream> #include <type_traits> template<typename... T> class A {}; int main(){ using Ty1 = A<int, int, int>; using Ty2 = int; if constexpr (is_instance_of<Ty1,A>::value) {//true std::cout << "Ty1: instance"; } if constexpr (is_instance_of<Ty2,A>::value) {//false std::cout << "Ty2: instance"; } }

出力結果↓

Ty1: instance

このような感じにインスタンスかどうかを区別できます.

質問

非型の場合にも同様に区別することは可能でしょうか

理想↓

cpp

template<auto...> struct A {}; int main(){ static_assert(is_instance_of_nontype<A<10> , A>);//ok static_assert(is_instance_of_nontype<A<10.0f>, A>);//ok static_assert(is_instance_of_nontype<int , A>);//error static_assert(is_instance_of_nontype<A<'a'> , A>);//ok }

試したこと

C++17以前に同様の質問があり,型を指定すれば可能とのことでした.

C++17 C++20と進化し続けていますが,まだ上記のようにis_instance_of<A<10>,A>のように,型に指定せずに書くことは不可能なのでしょうか?

↓型を指定する必要がある

cpp

template<typename X, typename T, template <X ...> typename U> class is_instance_of_nontype { private: template<typename V> class helper : public std::false_type {}; template<X... V> class helper<U<V...>> : public std::true_type {}; public: static constexpr bool value = helper<T>::value; }; template<auto...> struct A {}; int main(){ using T1 = A<10>; using T2 = A<20>; using T3 = A<10.0>; using T4 = A<'a'>; //true if constexpr (is_instance_of_nontype<int, T1, A>::value) { cout << "T1" << endl; } //false T2はA<int型>であってA<float型>でないのでfalse if constexpr (is_instance_of_nontype<float, T2, A>::value) { cout << "T2" << endl; } //true if constexpr (is_instance_of_nontype<double, T3, A>::value) { cout << "T3" << endl; } //true if constexpr (is_instance_of_nontype<char, T4, A>::value) { cout << "T4" << endl; } //理想は↓ 型にとらわれたくない //if constexpr (is_instance_of_nontype<T2, A>::value) { //true // //} }

↓出力結果

T1 T3 T4

よろしくお願いします.

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

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

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

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

メタプログラミング

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

C++

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