如何使用可变数量的基数 class 使基数 class 的运算符可见(请参阅下面的代码)?

How to make base class's operators visible with variadic number of base classes (please see code below)?

从基 class 公开运算符的最佳方法是什么,就像下面的代码试图做的那样。我想对于一个或两个基数 classes 我们会使用 using 语法,但是对于可变数量的基数 classes,像 using Base<Ts>::operator=...; 这样的东西可能吗?

template <typename T, typename Derived>
class varU
{
    protected:
    varU() = default;

    Derived& operator=(T val)
    {
        static_cast<Derived*>(this)->set(val);
        return *static_cast<Derived*>(this);
    }
};

template <typename ...Ts>
class var : public varU<Ts, var<Ts...>>...
{
    // using varU<Ts, var<Ts...>>::operator=...;  // Something like this?

    private:
    template <typename T>
    void set(const T& v)
    {
    }
};

编辑:

似乎 using Base<Ts>::operator=... 确实是我在 C++17 中寻找的正确语法。我使用了错误的标准版本并期待 C++17。由于这是我的猜测,所以我没有深入挖掘。

我不太确定,你想用你的代码实现什么,所以也许你想在你的问题中更详细一点。

但是关于代码注释中的问题,答案是肯定的,在 C++17 中是可能的。 如果你真的想使用你的运算符,你还必须声明 varU class 是 var 的朋友:

以下在 gcc 和 clang 上编译:

template <typename T, typename Derived>
class varU
{
    protected:
    varU() = default;

    Derived& operator=(T val)
    {
        static_cast<Derived*>(this)->set(val);
        return *static_cast<Derived*>(this);
    }
};

template <typename ...Ts>
class var : public varU<Ts, var<Ts...>>...
{
    template <typename T, typename Derived>
    friend class varU;

    public:
     using varU<Ts, var<Ts...>>::operator=...;  // Something like this?

    private:
    template <typename T>
    void set(const T& v)
    {
    }
};

int main() {
    var<int, float> x;
    x = 5;
    x = 5.f;

    return 0;
}

live code here.