Я бы сказал, что есть варианты:
Для фиксированного количества строк:
1) вернуть пару, кортеж или структуру, которую вы определяете сами. Что-то вроде:
struct BrokenDownString {
std::string firstbit;
std::string middlebit;
std::string endbit;
};
Тогда либо:
BrokenDownString decode(std::string message);
или просто предоставьте BrokenDownString конструктор, принимающий сообщение в качестве параметра.
2) Получить несколько выходных параметров по указателю или непостоянной ссылке:
void decode(const std::string &message, std::string &out_1, std::string &out_2) {
out_1 = /*whatever*/;
out_2 = /*whatever*/;
}
Для двух строк все остальное (даже массив) излишне.
Однако для переменного числа строк вы можете:
1) вернуть std::vector<std::string>
(помните, что это может привести к избыточному копированию).
2) взять std::vector<std::string> &
в качестве параметра и добавить результаты (это может копировать строки, но не контейнер).
3) сделать декодировать шаблон функции, принимая в качестве параметра выходной итератор:
template<typename OUT>
void decode(const std::string message, OUT out) {
// do parsing
*(out++) = firstbit;
*(out++) = nextbit;
// etc.
}
Тогда, если вызывающая сторона хочет получить результаты в векторе:
std::vector<std::string> v;
decode(message, std::back_inserter(v));
Если звонящий предпочитает их в деке:
std::deque<std::string> d;
decode(message, std::back_inserter(d));
Если звонящий хочет получить их в списке в обратном порядке:
std::list<std::string> l;
decode(message, std::front_inserter(l));
и т. Д.
4) Если вы хотите что-то подобное вышеописанному, но по какой-то причине вы не хотите писать код шаблона, сделайте decode take в качестве параметра объект, который он сообщает каждой строке:
struct DecodeTarget {
virtual void append(const std::string &) = 0;
};
void decode(std::string message, DecodeTarget &out) {
// do parsing
out.append(firstbit);
out.append(nextbit);
// etc.
}
Тогда, если звонящий хочет получить результаты в векторе:
class VectorTarget : public DecodeTarget {
private:
std::vector<std::string> &results;
public:
VectorTarget(std::vector<std::string> &v) : results(v) { }
void append(const std::string &bit) { v.push_back(bit); }
};
std::vector<std::string> v;
VectorTarget vt(v);
decode(message, vt);