我有一个具有虚函数的可变参数类模板。此函数使用Ts...
之一的方法。
如果bar()
具有Ts...
,我希望仅baz()
函数实例化。目前,编译器实例化该函数并报告x
没有函数baz()
的错误。由于虚拟功能不能是模板,因此我不能SFINAE。
template <class... Ts>
struct Foo
{
static constexpr auto I = 2;
virtual void bar()
{
auto x = std::get<I>(std::make_tuple(Ts::create()...));
x.baz();
}
};
有什么方法可以解决这个问题?我知道我可以通过将工作传递给Foo
派生的辅助类来专门化,如果Ts...
具有baz()
,则根据条件将类型存储在特殊元组中,但我不知道#39; t想要引入另一个间接层。还有其他选择吗?
答案 0 :(得分:1)
我将调用经典的“有成员”技巧(原谅我,我忘记了我先看到的地方)。
我已经说服VS2013这没关系:
template<typename T>
struct HazBaz
{
struct YesSir{char y[2];};
struct NoSir{char y;};
template<typename A>
static auto Frob(A &&a) ->
typename std::enable_if<
std::is_same<decltype(a.baz()), decltype(a.baz())>::value,
YesSir
>::type;
static NoSir Frob(...);
static const bool value =
sizeof(Frob(declval<T>())) == sizeof(YesSir);
};
template<typename T0, typename ...TN>
struct AllHazBaz
{
static const bool value =
HazBaz<T0>::value &&
AllHazBaz<TN...>::value;
};
template<typename T>
struct AllHazBaz<T>
{
static const bool value = HazBaz<T>::value;
};
template<bool implementBar, typename ...Ts>
struct FooBase
{
// Assuming that we do
virtual void bar()
{
// Do the things here
}
};
template<typename ...Ts>
struct FooBase<false, Ts...>
{
// Look ma, no bar!
};
template<typename ...Ts>
struct Foo : FooBase<AllHazBaz<Ts...>::value, Ts...>
{
};
编辑:Derp。只需再次阅读这个问题。老实说,我不知道如果没有继承,那将是多么可能。