如何在虚拟方法中围绕安装进行工作

How do I work around instaniation inside a virtual method?

本文关键字:安装 工作 虚拟 方法      更新时间:2023-10-16

我有一个可变类模板,它有一个虚拟函数。此函数使用一个Ts...中的方法。

我希望仅在Ts...具有baz()的情况下实例化bar()函数。当前编译器实例化该函数并报告一个错误,即x没有函数baz()。由于虚拟函数不能是模板,所以我无法将其分解。

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(),则将类型存储在基于条件进行专门化的元组中,但我不想引入另一种间接级别。还有其他选择吗?

更新:这是一个示例程序。

我将调用经典的"has member"技巧(原谅我,我忘了我第一次看到它的地方)。

我已经说服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。把问题再读一遍。老实说,如果没有继承权,我不知道这怎么可能。