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

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

新規登録して質問してみよう
ただいま回答率
85.46%
C++

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

Q&A

解決済

1回答

609閲覧

型関数にならない原因

jbe00214

総合スコア63

C++

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

0グッド

0クリップ

投稿2021/06/01 20:58

編集2021/06/01 21:06

前提・実現したいこと

コンパイル時に解決できることは,可能な限り型関数を使おうと思っています。
課題となっているのは,テンプレートクラス型と一致するか否かをコンパイル時に確認する方法です。テンプレート引数型は一致しなくても良いものとし,クラス名が一致するか否かを検出します。is_same_vを使ってコード例のように作成したのですが,うまくいきません。以下の「試したこと」のように,メンバを含めないと機能するので何かヒントがあるのかと思っておりますが,わかりませんでした。is_same_vにはこだわらないのですが,何か解決方法がわかる方がおられれば教えていただければと思います。単純な方法で解決できそうな気がするのですが。

発生している問題・エラーメッセージ

Static_assert expression is not an integral constant expression

該当のソースコード

C++

1template<typename T,size_t N> 2class foo{ 3 std::array<T,N> ar; 4}; 5template<typename T,size_t N> 6class boo{ 7 std::array<T,N> ar; 8}; 9 10template <typename T,size_t N,template<typename,size_t>class FOO> 11constexpr bool foo_type(FOO<T,N>) 12{ 13 return is_same_v<FOO<T,N>, foo<T,N>>; 14} 15 16int main(){ 17 foo<int,2> f; 18 boo<int,2> b; 19 20 static_assert( foo_type(f) ); 21 static_assert( !foo_type(b) ); 22}

試したこと

以下のようにメンバを書かないと,型関数として機能する。

C++

1template<typename T,size_t N> 2class foo{}; 3template<typename T,size_t N> 4class boo{};

補足情報(FW/ツールのバージョンなど)

clang
c++17

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

なんでNGなのかはわかりません。すみません。
以下の実装はWandboxでは期待通りコンパイルできていると思います。

C++

1#include <stddef.h> 2#include <array> 3#include <type_traits> 4 5template<typename T,size_t N> 6class foo{ 7 std::array<T,N> ar; 8}; 9template<typename T,size_t N> 10class boo{ 11 std::array<T,N> ar; 12}; 13 14template <typename T> 15struct is_foo_impl 16{ 17 static const bool value = false; 18}; 19template <typename T, size_t N> 20struct is_foo_impl<foo<T, N>> 21{ 22 static const bool value = true; 23}; 24template <typename T> 25struct is_foo 26{ 27 using U = std::remove_cv_t<std::remove_reference_t<T>>; 28 static const bool value = is_foo_impl<U>::value; 29}; 30template <typename T> 31constexpr bool is_foo_v = is_foo<T>::value; 32 33template <typename T> 34constexpr bool is_foo_test(T&&) 35{ 36 return is_foo_v<T>; 37} 38 39int main() 40{ 41 foo<int, 2> f; 42 boo<int, 2> b; 43 static_assert(is_foo_v<decltype(f)>); 44 static_assert(!is_foo_v<decltype(b)>); 45 static_assert(is_foo_test(f)); 46 static_assert(!is_foo_test(b)); 47 48 return 0; 49}

投稿2021/06/01 22:51

ttact

総合スコア170

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbe00214

2021/06/02 00:04

私は,基本がしっかり分かっていないので,ご提示頂いた一連の方法(4つのクラスの使い方)が正に知りたかったことでした。たいへん,助かりました。やりたかったことが解決できました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問