enable_if 和 is_same 的多个模板函数以及缺少 C++ 中 class 模板的参数列表

Multiple template functions with enable_if and is_same and with missing argument list of the class template in C++

我有以下代码可以很好地编译:

#include <iostream>

struct Res {};
struct Jac {};

template <typename T, typename S>
class A;

template <typename S>
class A<Res, S>
{
    public:
        A() { std::cout << "A<Res, S>" << std::endl; }
};

template <typename S>
class A<Jac, S>
{
    public:
        A() { std::cout << "A<Jac, S>" << std::endl; }
};



template <typename T, typename S>
class B;

template <typename S>
class B<Res, S>
{
    public:
        B() { std::cout << "B<Res, S>" << std::endl; }
};

template <typename S>
class B<Jac, S>
{
    public:
        B() { std::cout << "B<Jac, S>" << std::endl; }
};


template<typename S, typename EvalT,
    std::enable_if_t<std::is_same<EvalT, A<Res,S>>::value, bool> = true
>
void foo() 
{
    A<Res, S> a_res;
    A<Jac, S> a_jac;
}

template<typename S, typename EvalT,
    std::enable_if_t<std::is_same<EvalT, B<Res,S>>::value, bool> = true
>
void foo()
{
    B<Res, S> b_res;
    B<Jac, S> b_jac;
}

int main() {

    foo<int, A<Res,int>>();
    foo<int, B<Res,int>>();

    return 0;
}

但是我对 main() 函数中的调用不满意。我希望它们看起来像这样:

    foo<int, A>();
    foo<int, B>();

这意味着对 foo() 的模板进行以下修改:

template<typename S, typename EvalT,
    std::enable_if_t<std::is_same<EvalT, B>::value, bool> = true
>
void foo()
{
    B<Res, S> b_res;
    B<Jac, S> b_jac;
}

这显然不能编译。这个想法是有一个函数,它可以实例化 AB 而无需为我的 类 明确指定 T 因为我知道 foo() 必须创建2 个以 ResJac 作为类型参数的实例。有没有办法让代码更整洁,实现这样的行为?

您可以更改 foo 以接受模板模板参数 CT 模板化两种类型,并且 enable_if 根据 CT<Res, S> 是否为与 A<Res, S>B<Res, S>:

相同的类型
template<typename S, template<typename, typename> typename CT,
    std::enable_if_t<std::is_same<CT<Res,S>, A<Res,S>>::value, bool> = true
>
void foo() 
{
    A<Res, S> a_res;
    A<Jac, S> a_jac;
}

template<typename S, template<typename, typename> typename CT,
    std::enable_if_t<std::is_same<CT<Res, S>, B<Res,S>>::value, bool> = true
>
void foo()
{
    B<Res, S> b_res;
    B<Jac, S> b_jac;
}

这是 demo