gpt4 book ai didi

C++ 可变参数模板

转载 作者:行者123 更新时间:2023-11-30 03:54:29 27 4
gpt4 key购买 nike

我正在尝试创建一个使用可变参数模板的多态容器。容器初始化为

container<tag, std::string, int, int, int> m;

我想使用以下语法:

auto& v2 = m.find<2, 3, 4>(255, 0, 0);

模板参数将指定“列”,对于参数,我希望编译器期望适当的类型。

对于一个模板参数 ( find<2>(255)) 我使用了:

template < int idx > const typename value_type & 
find( const typename std::tuple_element<idx, typename value_type>::type &key) {
const std::size_t row_id = getId<idx>(key);
return data_.at(row_id);
}

效果很好,所以我想按如下方式扩展它:

template<int ... idx> const typename value_type & 
find(const typename std::tuple_element<idx..., typename value_type>::type &keys...) {
const std::size_t row_id = getId<idx...>(keys);
return data_.at(row_id);
}

什么根本不起作用。编译错误 C2660 - 查找:函数不带 3 个参数。有人可以向我解释一下,我在这里想念什么吗?谢谢。

编辑:

container 的标题类是

template<typename ... Arguments> class container

value_type提到的是

typedef std::tuple < Arguments... > value_type;

编辑2:T.C. 的回答确实很有用,尽管我仍在使用可变参数模板查找错误。目前:

enum tag {/*...*/}

int main() {
container<tag, std::string, int, int, int> m;
}

template<typename ... Arguments> class container {
public:
typedef std::tuple < Arguments... > value_type;
std::vector<value_type> data_;

template <int id> void narrowRange(
std::set<std::size_t> & range,
const typename std::tuple_element<id, typename value_type>::type &key)
{
// all commented out
}

template <int id, int ... idx>
void narrowRange(
std::set<std::size_t> & range,
const typename std::tuple_element<id, typename value_type>::type & key,
const typename std::tuple_element<idx, typename value_type>::type & ... keys) // <-
{
narrowRange<idx...>(range, keys...);
// rest commented out
}

将在标记行上调用 MSVS2013 中的内部错误。任何建议为什么将不胜感激。

最佳答案

首先,value_type不需要 typename - 我相当确定语法实际上禁止它。

其次,你在扩展idx为时过早,并且还错误地尝试扩展 keys在声明中。 (第二个 ... 实际上被解析为 C 风格的可变参数。)您也没有扩展包 keys。在函数体内。假设你想要 find<2, 3, 4>(255, 0, 0)调用getId<2, 3, 4>(255, 0, 0) , 正确的语法是

template<int ... idx> const value_type & 
find(const typename std::tuple_element<idx, value_type>::type &... keys) {
const std::size_t row_id = getId<idx...>(keys...);
return data_.at(row_id);
}

关于C++ 可变参数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29480676/

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