ゲーム作りは楽しい

なんか書く

constexprで評価できるかどうか判定するメタ関数

はじめに

C++23やC++26で多くの関数がconstexpr対応しましたが、
コンパイラが対応済みかは話が別…
そこでこの関数はconstexpr評価できるかどうかを調べるメタ関数が作れそうか調べておりました。

メタ関数

#include <type_traits>

template<auto Lambda>
struct is_constexpr 
{
private:
    template<class L, int=(L{}(), 0)>
    static consteval bool impl(L) { return true; }
    static consteval bool impl(...) { return false; }
public:
    static constexpr bool value = impl(Lambda);
};
template<auto Lambda>
inline constexpr bool is_constexpr_v = is_constexpr<Lambda>::value;

使い方としては以下のようにconstexpr対応済みかどうかで、処理を分けたり
(雑な単位でよければバージョンマクロとかで分岐する手もなくはないと思いつつ…)

constexpr double my_abs(double x)
{
    if constexpr (is_constexpr_v<[]{return std::abs(0);}>) {
        return std::abs(x);
    } else {
        return x >=0 ? x : -x;
    }
}

マクロが嫌じゃなければ、こういうのをしても面白いかもね

#define constexpr_callable(...) constexpr (is_constexpr_v<[]{return __VA_ARGS__ ;}>)

constexpr double my_abs(double x)
{
    if constexpr_callable(std::abs(0)) {
        return std::abs(x);
    } else {
        return x >=0 ? x : -x;
    }
}

参考

Thanks 鍵フォロワ

stackoverflow.com