0

我有以下适用于 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;
}

问题在于使用 Composite<Args...>::foo的行,因为它不在 c++ 标准中。这就是为什么它不适用于 gcc:Composite<Args...> 不是 Composite 的基类。

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

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

谢谢。

4

1 回答 1

0

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

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

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

于 2021-09-02T10:57:05.760 回答