我具有以下签名的功能:
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);
}
尽管我不知道编译器如何工作,但它可以工作:
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