У меня есть функция, возвращающая именованную структуру, состоящую из двух целых, следующим образом:
struct myStruct {int i; int j;};
myStruct myFunction(int myArg){
switch (myArg) {
case 0: return {1,2};
case 1: return {2,3};
default: return {4,5};
}
}
Я хочу иметь возможность вернуть надлежащим образом инициализированную структуру из моего оператора switch.
Я могу сделать это, объявив именованную структуру и инициализировав ее, а затем вернув именованную структуру,
но было бы чище, если бы компилятор создал для меня анонимные структуры, как в моем примере выше — который не компилируется.
Можно ли заставить это работать (законно)? Или какой самый чистый способ достижения моей цели?
Это совершенно верно C ++ 11 код, если мы посмотрим на проект стандарта C ++ раздел 6.6.3
Заявление о возврате параграф 2 говорит:
Оператор return со списком фигурных скобок инициализирует объект
или ссылка, которая должна быть возвращена из функции путем копирования-инициализации списка (8.5.4) из указанного списка инициализатора.
и это обеспечивает следующий пример:
[ Example:
std::pair<std::string,int> f(const char* p, int x) {
return {p,x};
}
—end example ]
мы можем видеть из живой пример что это работает, но не будет работать до C ++ 11 как мы можем видеть из этого живой пример.
Если вы используете gcc
или же clang
и вы не можете использовать C ++ 11 по какой-то причине у вас есть возможность использования составные литералы как продолжение в C ++ хотя это C99 особенность и как мы можем видеть из этого живой пример gcc
предупреждает:
предупреждение: ISO C ++ запрещает составные литералы [-Wpedantic]
Другой вариант — добавить конструкторы в вашу структуру:
struct myStruct
{
int i; int j;
myStruct() : i(0), j(0) {} ;
myStruct(int x, int y) : i(x), j(y) {} ;
};
myStruct myFunction(int myArg){
switch (myArg) {
case 0: return myStruct(1,2) ;
case 1: return myStruct(2,3) ;
default: return myStruct(4,5) ;
}
}
Рассматривали ли вы добавить конструктор?
struct myStruct
{
int i;
int j;
myStruct(int x, int y) {i = x; j = y;}
myStruct() {} // still want this, otherwise "myStruct x;" won't compile
};
myStruct myFunction(int myArg){
switch (myArg) {
case 0: return myStruct(1,2);
case 1: return myStruct(2,3);
default: return myStruct(4,5);
}
}