我如何解决虚拟方法中的instaniation?

时间:2014-11-11 02:15:46

标签: c++ c++11

我有一个具有虚函数的可变参数类模板。此函数使用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想要引入另一个间接层。还有其他选择吗?

更新:Here's an example program.

1 个答案:

答案 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。只需再次阅读这个问题。老实说,我不知道如果没有继承,那将是多么可能。