C++11 省略号可以/应该/会适用于元组吗?

C++11 省略号可以/应该/会适用于元组吗?,c++11,c++14,C++11,C++14,在C++11中,可变模板允许使用任意数量的参数调用函数,省略号运算符…允许可变函数对每个参数执行某些操作,即使每个参数的操作不同: template<typename... Types> void dummy(Types... ts){} //dummy to allow function calls via parameter expansion template<typename... Numerics> void increment5(Numerics&.

在C++11中,可变模板允许使用任意数量的参数调用函数,省略号运算符
允许可变函数对每个参数执行某些操作,即使每个参数的操作不同:

template<typename... Types>
void dummy(Types... ts){} //dummy to allow function calls via parameter expansion

template<typename... Numerics>
void increment5(Numerics&... ns){
    dummy(ns+=5 ...); //parameter expansion (need space after 5 because 5. is decimal)
    //it means "dummy(ns_first+=5, ns_second+=5, ns_third+=5, etc.)"
}

int main(){
    int i = 0;
    float f = 1.1;
    std::valarray<int> vi = {1,2,3};

    increment5(i,f,vi);

    cout
        <<i<<endl
        <<f<<endl
        <<vi[0]<<' '<<vi[1]<<' '<<vi[2]<<endl;

}
模板
void dummy(类型…ts){}//dummy允许通过参数扩展调用函数
模板
无效增量5(数字和…ns){
dummy(ns+=5…)//参数扩展(5后面需要空格,因为5.是十进制)
//它的意思是“虚拟(ns_first+=5,ns_second+=5,ns_third+=5,等等)”
}
int main(){
int i=0;
浮点数f=1.1;
std::valarray vi={1,2,3};
增量5(i、f、vi);
库特

创建解决方案的基本工具存在于C++14中,但您确实需要通过一个额外的辅助函数进行额外级别的间接操作,类似于您链接到的答案:

template<typename Tuple, std::size_t... I>
void
_increment5(Tuple& t, std::index_sequence<I...>)
{
  dummy( std::get<I>(t) += 5 ... );
}

template<typename... Numerics>
void
increment5(HeterogeneousValueArray<Numerics...>& hva)
{
  _increment5(hva.inner, std::index_sequence_for<Numerics...>());
}
apply
函数不在C++14中(但适用于C++17),因此您需要自己编写它,例如从C++14草稿中复制它


直接允许您所需的最接近的建议是,但该建议尚未被接受,因此在C++14中不会被接受。

我认为您不需要为要在扩展元组上调用的每个函数编写帮助函数。您可以使用一个函数模板,该模板包含一个元组和一个函数对象(包括函数指针),并将function对象应用于元组的每个元素。哦,是的,我也不认为您可以使用这样的重载函数。在这种情况下,您必须创建一个帮助函数。对于重载函数,您可以在C++1y中使用通用lambda。它也是一种帮助函数,但具有lambdas的常见优点(局部性,编写简单)。您不需要C++14,您可以在C++11中创建自己的
std::index_sequence
。所有必需的语言功能都在中。是的,我知道,我写了将其添加到标准中的建议:)但在C++14中,您不必这样做,实现提供了它。N3728似乎是我想要的(不是元组,而是存储的参数包),但没有解释向元组添加语法是否会导致问题。
template<typename... Numerics>
void increment5(HeterogeneousValueArray<Numerics...>& hva){
    increment5(hva.inner... ); //expand a tuple
}
template<typename... Numerics>
void increment5(HeterogeneousValueArray<Numerics...>& hva){
    dummy((hva.inner+5)... ); //expand a tuple
}
template<typename Tuple, std::size_t... I>
void
_increment5(Tuple& t, std::index_sequence<I...>)
{
  dummy( std::get<I>(t) += 5 ... );
}

template<typename... Numerics>
void
increment5(HeterogeneousValueArray<Numerics...>& hva)
{
  _increment5(hva.inner, std::index_sequence_for<Numerics...>());
}
template<typename... Numerics>
void
increment5(HeterogeneousValueArray<Numerics...>& hva)
{
  apply(hva.inner, [](auto& n) { n += 5; });
}