SFINAE和继承

问题描述 投票:0回答:1

我正在寻找以下问题的解决方案:

#include <string>

class A
{
public:
    template <typename T>
    static typename std::enable_if<std::is_same<T, std::string>::value, void>::type foo(T val)
    {
        printf("std::string\n");
    }

    template<typename T, typename... Arg>
    static void multiple(Arg&&... arg)
    {
        T::foo(arg...);
    }
};

class B : public A
{
public:
    template <typename T>
    static typename std::enable_if<std::is_same<T, int>::value, void>::type foo(T val)
    {
        printf("int\n");
    }
};

int main()
{
    std::string a;
    int b = 0;
    A::multiple<B>(a, b);
}

[如果两个foo方法都在同一个类中,或者我强制从适当的类(foo中的A::foostd::string中的B::foo)强制使用int,则所有方法都正常,但是我需要多个类,因为基类必须是可扩展的。我不能使用简单的专业化,因为我需要更多的SFINAE功能,例如检测std::pairstd::tuple等。我也不想将foo方法从类移动到名称空间。您有任何想法如何解决此问题?

c++ templates inheritance sfinae
1个回答
1
投票
[这里B::foo隐藏A::foo,您需要一个using

class B : public A { public: using A::foo; template <typename T> static typename std::enable_if<std::is_same<T, int>::value, void>::type foo(T val) { printf("int\n"); } };

© www.soinside.com 2019 - 2024. All rights reserved.