gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:52:25 24 4
gpt4 key购买 nike

我有一个类(去掉了不相关的细节):

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;
}
};

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

我想重载 []将调用语法从:
    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[] (见此related question)。

此外,不可能从赋值中推断出函数(或运算符)的返回类型。

所以下T也不是 idxtemplate <typename T, std::size_t idx> operator[] ...不幸的是,可以推导出来,这将其排除在可行的重载候选集之外。

关于c++ - 模板化方法中的运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62334798/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com