模板化方法中的运算符重载

Operator overload in a templated method

我有一个class(删除了不相关的细节):

template <typename... Ts>
class ParameterPack
{
  private:
    std::tuple<Ts...> parameters;


  public:
    ParameterPack<Ts...>(const char* pVariableName)
    {
        /// Irrelevant extra details
    }


    template <typename T, std::size_t idx>
    T getValue()
    {
        return std::get<idx>(parameters);
    }


    template <std::size_t idx>
    void updateValue(unsigned int val)
    {
        std::get<idx>(parameters) = val;

        /// Irrelevant extra details
    }

template <class... Ts>
static ParameterPack<Ts...>* extractParameterPack(const char* name)
{
    // Construnt the new parameter extractor
    auto paramPack = new ParameterPack<Ts...>(name);

    /// Irrelevant extra details

    return paramPack;
}
};

其主要功能是将字符串解析为其数据元素(内部保存在私有元组中)。但是,我正在尝试改进 updateValuegetValue 界面的人体工程学。

我想重载 [] 以更改调用语法:

    auto val1 = parameterPack->getValue<float, 1>();

至:

    auto test2 = parameterPack[1];

但我的重载从未生效。我认为过载应该看起来接近于:

或者可能:

    template <typename T, std::size_t idx>
    const T& operator[](std::size_t _idx) const
    {
        std::cout << "yay, overloading " << idx << std::endl;
        return idx * 1.0;
        // return std::get<idx>(parameters);
    }

如果我直接调用 operator[],它会执行我的重载,但如果我只是尝试正常使用 [] 运算符则不会。

无法在索引上专门化模板化 operator[],因为索引是 运行 时间 属性。

因此 std::tuple 有一个 get<idx>() 成员函数而不是 operator[](参见 )。

此外,无法从赋值中推导出函数(或运算符)return类型。

因此,template <typename T, std::size_t idx> operator[] ... 中的 Tidx 都无法推导出来,不幸的是,这将其排除在可行的重载候选集合之外。