我试图设置引用元组中引用的对象的值,但是无法正确获取解包语法。
namespace detail {
template<class... Types, std::size_t... Is>
void assign_values_helper(std::tuple<Types&...>& dest, std::index_sequence<Is...>, Types... values)
{
std::get<Is>(dest)... = values...;
}
} // end namespace detail
template<class... Types>
void assign_values(std::tuple<Types&...>& dest, Types... values)
{
assign_values_helper(dest, std::index_sequence_for<Types...>{}, values...);
}
我在assign_values_helper
中收到关于Is
未展开的错误。
使用assign_values
的示例
int a {};
double b {};
std::tuple<int&, double&> tup = {a, b};
assign_values(tup, 1, 2.0);
答案 0 :(得分:5)
tup = std::make_tuple(1, 2.0);
有一些特殊的重载operator=
用于分配不同类型的std::tuple
:
template <class... UTypes>
tuple& operator=(const tuple<UTypes...>& u);
template <class... UTypes>
tuple& operator=(tuple<UTypes...>&& u);
第二个(在这里被调用的那个)完全符合你的要求:
对于所有
i
,将std::forward<Ui>(std::get<i>(u))
分配给get<i>(*this)
。
答案 1 :(得分:4)
两个问题:
您正试图在https://activemq.apache.org/apollo/documentation/stomp-manual.html#Temporary_Destinations中不允许的上下文中扩展包。
整个作业表达式应该只有一个包扩展。
我们可以通过引入虚拟数组来修复它,其初始化程序将为包扩展提供上下文:
$('#Category').on('change', function (e) {
$("#Container").append(`@foreach (var item in Model.YetkinlikKategorileri.Where(x => x.Id == $('#Category').val()))
{
<p>hello</p>
}`);
});
c++14解决方案是折叠表达式,当然:
int dummy[]{ ((void(std::get<Is>(dest) = values)), 0)... };
(void)dummy;
答案 2 :(得分:0)
感谢您提供一个好榜样!
std :: tie非常适用于此:
template<class... Types>
void assign_values(std::tuple<Types&...>& dest, Types... values) {
dest = std::tie(values...);
}
int main() {
int a {};
double b {};
std::tuple<int&, double&> tup = {a, b};
assign_values(tup, 1, 2.0);
return a + b;
}
请参阅https://godbolt.org/g/oU2Pi8以获取证明。
附加说明:最好添加一些const安全性,这也会阻止你按值传递字符串:
template<class... Types>
void assign_values(std::tuple<Types&...>& dest, const Types&... values) {
dest = std::tie(values...);
}