C++20言語機能を利用した、ある式がコンパイル時に評価可能かを判定するメタ関数的なもの。id:yohhoy:20190528 の別解。
本記事の内容はStackOverflowで見つけた質問と回答に基づく。
// C++20以降 template<class Lambda, int = (Lambda{}(), 0)> constexpr bool is_constexpr(Lambda) { return true; } constexpr bool is_constexpr(...) { return false; } template<int N> void do_stuff(); void do_stuff(int N); template<typename T> int process(const T&) { // 式 T::number() をコンパイル時に評価可能? if constexpr (is_constexpr([]{ T::number(); })) { do_stuff< T::number() >(); return 1; } else { do_stuff( T::number() ); return 2; } } struct X { static constexpr int number() { return 42; } }; struct Y { static int number() { return 42; } }; int main() { assert(process(X{}) == 1); // OK(C++17: NG) assert(process(Y{}) == 2); // OK }
関連URL