3

Guillaume Racicotは、テンプレート変数をどのように特殊化できるかについて、この質問に対して優れた回答を提供しました。しかし、でテンプレート化された関数ポインターの配列を作成する際に問題が発生しています。たとえば、このコード:

struct vec
{
    double x;
    double y;
    double z;
};

namespace details
{
template <typename T>
constexpr double X(const T& param) { return param.x; }

template <typename T>
constexpr double Y(const T& param) { return param.y; }

template <typename T>
constexpr double Z(const T& param) { return param.z; }
}

template <typename T, typename = void>
constexpr double (*my_temp[])(const vec&) = { &details::X<T>, &details::Y<T> };

template <typename T>
constexpr double (*my_temp<T, enable_if_t<is_floating_point_v<decltype(details::X(T()))>>>[])(const vec&) = { &details::X<T>, &details::Y<T>, &details::Z<T> };


int main() {
    vec foo = { 1.0, 2.0, 3.0 };

    for(const auto i : my_temp<decltype(foo)>) {
        cout << (*i)(foo) << endl;
    }
}

gcc の出力:

1
2
3

しかし、では出力のみ:

1
2

これを回避するためにできることはありますか?

4

1 に答える 1