gpt4 book ai didi

c++ - 如何获取模板参数包以推断按引用传递而不是按值传递?

转载 作者:行者123 更新时间:2023-11-30 00:45:52 24 4
gpt4 key购买 nike

在下面的类中,wrapper 接受一个指向任意 const 方法的指针,并返回使用 const 调用该方法的结果删除。这可用于生成相应的非 const 方法...

struct C {
int x[10];

int const& get(int i) const { return x[i]; }
int const& getr(int const& i) const { return x[i]; }

template<typename T, typename... Ts>
auto& wrapper(T const& (C::*f)(Ts...) const, Ts... args) {
return const_cast<T&>((this->*f)(args...));
}

int& get(int i) { return wrapper(&C::get, i); }
int& getr(int const& i) { return wrapper(&C::getr, i); }
};

差不多。

问题是 final方法 getr() 无法编译,因为传递给 wrapper() 的参数列表并不意味着按引用传递。当我们进入 wrapper() 时,编译器正在寻找 getr() 的按值传递版本。

这有什么技巧吗?

最佳答案

您可以 perfect forward函数的参数:

template<typename T, typename... Ts, typename... Args>
auto& wrapper(T const& (C::*f)(Ts...) const, Args&&... args) {
return const_cast<T&>((this->*f)(std::forward<Args>(args)...));
}

这是通过使 args 成为转发引用参数包来实现的。请注意,我们需要引入一个新的 Args 模板参数包,以便正确推导参数。

关于c++ - 如何获取模板参数包以推断按引用传递而不是按值传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41160125/

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