Если вы используете Google Guava , это будет так же просто, как:
byte[] bytes = ByteStreams.toByteArray(inputStream);
Операторы преобразования на самом деле не считаются разными перегрузками и не вызываются на основании их возвращаемого типа . Компилятор будет использовать их только тогда, когда он должен (когда тип несовместим и должен быть преобразован) или когда явным образом предлагается использовать один из них с оператором приведения.
Семантически, каков ваш код сделать это объявить несколько различных операторов преобразования типов и не перегрузок одного оператора .
Это не возвращаемый тип. Это преобразование типа.
Учтите: func () создает объект типа func. Нет никакой двусмысленности относительно того, какой метод (конструктор) будет вызван.
Единственный вопрос, который остается, - это можно ли привести его к желаемым типам. Вы предоставили компилятору соответствующее преобразование, поэтому он доволен.
Нет Это действительно техническая причина для предотвращения перегрузки функций на типах результатов. Это делается в некоторых языках, таких как, например, Ada, но в контексте C ++, который также имеет неявные преобразования (и два их вида), полезность уменьшается, и взаимодействие обеих функций быстро приведет к двусмысленности.
Обратите внимание, что вы можете использовать тот факт, что неявные преобразования могут быть определены пользователем для имитации перегрузки по типу результата:
class CallFProxy;
CallFProxy f(int);
class CallFProxy {
int myParameter;
CallFProxy(int i) : myParameter(i) {}
public:
operator double() { std::cout << "Calling f(int)->double\n"; return myParameter; }
operator string() { std::cout << "Calling f(int)->string\n"; return "dummy"; }
};
Overload resolution chooses between multiple candidate functions. In this process, the return type of candidates is indeed not considered. However, in the case of conversion operators the "return type" is critically important in determining whether that operator is a candidate at all.