我不知道我有什么是编译器错误,或者我只是不知道我正在尝试做什么的语法.想象一个需要2个数组引用的函数:
void takeArrays(const char (&str1)[4], const char (&str2)[4]) {
}
Run Code Online (Sandbox Code Playgroud)
调用时编译正常:
takeArrays("foo", "bar");
Run Code Online (Sandbox Code Playgroud)
我为什么要这样做?因为传递const char*丢失了字符串文字的大小信息,这对我正在做的事情很重要.
但是,我真正想要做的是传递一个可变数量的数组引用.事情变得有点丑陋(变得更糟).我天真地试过这个:
template<typename... Args>
void takeArrays(const char (&Args... strs)[4]) {
}
Run Code Online (Sandbox Code Playgroud)
和GOT "error: variable or field ‘takeArrays’ declared void"和"error: expected primary-expression before ‘const’"(GCC 4.6).所以我尝试了这个:
template<typename... Args>
void takeArrays(const char (&(Args... strs))[4]) {
}
Run Code Online (Sandbox Code Playgroud)
并得到了"no matching function for call to ‘takeArrays(const char [4], const char [4])’"和"candidate is template<class ... Args> void takeArrays(const char (& (*)(Args ...))[4])".这是不可读的,但似乎接近我想要的.我尝试了很多变化,似乎无法编译.
假设有一个正确的方法来编写上述内容,我真正想做的是调用:
takeArrays("foo", …Run Code Online (Sandbox Code Playgroud) 我正在写一个函数的2个重载,它们都带有可变参数模板编译时参数.应该将符号作为模板,其他字符串.我想将模板实例化约束到这两种情况.我想出的最好的是:
bool func(SYMBOLS...)() if(!is(typeof(SYMBOLS[0]) == string)) {
}
Run Code Online (Sandbox Code Playgroud)
和
bool func(STRINGS...)() if(is(typeof(STRINGS[0]) == string)) {
}
Run Code Online (Sandbox Code Playgroud)
显然这只会检查第一个模板参数,虽然它给出了我到目前为止编写的代码,但我希望我能说"仅适用于所有字符串"和"仅适用于所有字符串".有办法吗?
我不知道这是编译器错误(Arch Linux 上的 gcc 4.8)还是标准的问题,但下面的代码无法编译。为什么允许 getFoo1 而不允许 getFoo2?
struct Foo {
int _i;
Foo(int i):_i(i) { }
};
Foo getFoo1(int i) {
if(i == 3) {
return { i + 2 };
} else {
return { i };
}
}
Foo getFoo2(int i) {
return i == 3 ? { i + 2 } : { i };
}
int main() {
auto foo1 = getFoo1(3); //fine
auto foo2 = getFoo2(3); //oops
return 0;
}
Run Code Online (Sandbox Code Playgroud)