我正在寻找以下问题的解决方案:
#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::foo
和std::string
中的B::foo
)强制使用int
,则所有方法都正常,但是我需要多个类,因为基类必须是可扩展的。我不能使用简单的专业化,因为我需要更多的SFINAE功能,例如检测std::pair
,std::tuple
等。我也不想将foo方法从类移动到名称空间。您有任何想法如何解决此问题?
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");
}
};