Я бы предложил возвратить Result-Type напрямую, вот так:
SomeStruct doSomething(int param) {...}
и выдает исключение в случаях, когда функция не может обработать (tux21b уже упоминал об этом). В качестве альтернативы вы можете вернуть два типа с помощью std::pair
, не выдавая исключение, например, так:
pair<SomeStruct, bool> doSomething(int param) {...}
И в-третьих, мне нравится объявлять выходные параметры в виде указателей вместо ссылок (как вы упомянули), потому что в коде вызова я вижу разницу входных и выходных параметров. С учетом функции:
void doSomething(const Somestruct& in, Somestruct* out) {...}
Тогда в коде вызова видно (не глядя на объявление функции), что является входным параметром и каков выходной параметр (если я последовательно применяю эту концепцию).
SomeStruct a;
SomeStruct b;
doSomething(a, &b); // you see a is input, b is output