前提・実現したいこと
コンパイル時に解決できることは,可能な限り型関数を使おうと思っています。
課題となっているのは,テンプレートクラス型と一致するか否かをコンパイル時に確認する方法です。テンプレート引数型は一致しなくても良いものとし,クラス名が一致するか否かを検出します。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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/02 00:04