假设我有这个可变的基类模板:
template <typename ... Types>
class Base
{
public:
// The member foo() can only be called when its template
// parameter is contained within the Types ... pack.
template <typename T>
typename std::enable_if<Contains<T, Types ...>::value>::type
foo() {
std::cout << "Base::foo()\n";
}
};
foo()
成员仅在其模板参数与Base
的参数中的至少一个匹配时才可以调用(Contains
的实现在本文的底部列出:]
Base<int, char>().foo<int>(); // fine
Base<int, char>().foo<void>(); // error
现在我使用类型的非重叠集定义从Base继承两次的派生类:
struct Derived: public Base<int, char>,
public Base<double, void>
{};
我希望在例如致电时>
Derived().foo<int>();
编译器会找出要使用的基类,因为它是SFINAE,而不包含
int
。但是,GCC 4.9和Clang 3.5都抱怨调用不明确。
我的问题是双重的:
Derived().Base<int, char>::foo<int>();
,我该怎么做才能完成这项工作? 编辑:Contains
的实现:
template <typename T, typename ... Pack>
struct Contains;
template <typename T>
struct Contains<T>: public std::false_type
{};
template <typename T, typename ... Pack>
struct Contains<T, T, Pack ...>: public std::true_type
{};
template <typename T, typename U, typename ... Pack>
struct Contains<T, U, Pack ...>: public Contains<T, Pack...>
{};
假设我有这个可变的基类模板:template
这是一个简单的示例:
尽管我不能详细告诉您为什么它不能按原样工作,但我在template <typename... Bases>
struct BaseCollector : Bases...
{
using Bases::foo...;
};
上添加了using Base<int, char>::foo;
和using Base<double, void>::foo;
,现在可以正常编译了。