如何将临时数组传递给标准C ++ 17中的函数

问题描述 投票:0回答:1

我具有以下签名的功能:

void foo(int argc, char const * const argv[]);

我想用一种简洁的方式称呼它:

foo(3, {"one", "two", "three"});

我知道C仅为此目的而支持复合文字(reference)。

我也知道如何使用模板(reference)解决问题。

但是,我的问题略有不同。函数签名是固定的-通常接受传递给main的参数,并且数组的大小不是预定义的。我正在为此功能编写测试,就我而言,所传递的数组在编译时是已知的。

是否有一种无需使用临时变量或包装器函数即可调用foo的方法,如下所示?

char const * array[3] = {"one", "two", "three"};
foo(3, array);
template<int N>
void wrapper(char const * const (&array)[N])
{
    foo(N, array);
}
c++ arrays parameter-passing c++17 temporary
1个回答
0
投票

尽管我不知道编译器如何工作,但它可以工作:

template<size_t N>
void foo(int argc, const char *(&&argv)[N]){
    int i=0;
    for( auto o: argv) {
        ++i;
        cout<<"array"<<i<<" = " << o<<"\n";
    }

    cout<< "\narray size "<<i<<"\n"<<argc<<"\n";
    return;
}

int main(){

    foo(3, {"one", "two", "three"});

}

array1 = one
array2 = two
array3 = three

array size 3
3
© www.soinside.com 2019 - 2024. All rights reserved.