继承的可变参数模板中基本成员的名称隐藏

Name hiding of base member in inherited variadic template

我有以下适用于 VS2017 的代码:

template <typename ... Args>
struct Composite: Args...
{
    using Composite<Args...>::foo;
    void foo(float exposure)
    {
        return this->foo(*this, exposure);
    }

    void internalBar(float e)  {  std::cout << "it works" << e;  }
};

这样使用:

struct A
{
    template <typename T>
    void foo(T& device, float exposure)
    {
        device.internalBar(exposure);
    }
};

struct B
{};

struct C
{};

int main(int argc, char *argv[])
{
    auto u = Composite<A, B, C>();
    u.foo(5.0f);
    return 0;
}

问题出在行 using Composite::foo 因为它不在 c++ 标准中。这就是它不适用于 gcc 的原因:Composite 不是 Composite.

的基础 class

我不得不使用这一行,因为 Composite 隐藏了 A 的 foo。

如何拉入单个打包参数的范围?

谢谢。

您可以通过添加一个间接级别来解决很多问题。

template <typename ... Args>
struct CompositeFooWrapper: Args...
{
};
    
template <typename ... Args>
struct Composite: CompositeFooWrapper<Args...>
{
    using CompositeFooWrapper<Args...>::foo;

演示:https://godbolt.org/z/ddsKc3rvx