Любой простой способ получить и инициализировать несколько возвращаемых значений из функции - PullRequest
0 голосов
/ 26 января 2019

В моем проекте есть несколько функций, которые возвращают несколько значений с помощью кортежа, и они используются многократно.Поэтому я просто хочу знать, есть ли какой-нибудь способ в c ++, с помощью которого я могу захватывать и инициализировать отдельные значения, возвращаемые этим вызовом функции.Ниже пример лучше объяснит этот вопрос

    #include <iostream>
    #include <string>
    #include <tuple>
    std::tuple<std::string,int,int> getStringWithSizeAndCapacity()
    {
         std::string ret = "Hello World !";
         return make_tuple(ret,ret.size(),ret.capacity());
    }
    int main()
    {
      //First We have to declare variable
      std::string s;
      int sz,cpcty;
      //Then we have to use tie to intialize them with return of function call
      tie(s,sz,cpcty) = getStringWithSizeAndCapacity();
      std::cout<<s<<" "<<sz<<" "<<cpcty<<std::endl;
      //Is there a way in which I can directly get these variables filled from function call
      //I don't want to take result in std::tuple because get<0>,get<1> etc. decreases readibility
      //Also if I take return value in tuple and then store that in individual variables then I am wasting
      //tuple as it will not be used in code
      return 0;
    }

1 Ответ

0 голосов
/ 26 января 2019

Есть ли способ, которым я могу напрямую заполнить эти переменные из вызова функции, я не хочу получать результат в std :: tuple, потому что get <0>, get <1> и т. Д. Снижает читаемость

Также, если я возьму возвращаемое значение в кортеже, а затем сохраню его в отдельных переменных, тогда я напрасно трачу кортеж, так как он не будет использоваться в коде

Я понимаю, что использование std::get<>() снижает читабельность, но вы можете попытаться улучшить его с некоторыми комментариями

// get the size of the returned string (position 1)
auto sz = std::get<1>(getStringWithSizeAndCapacity());

В любом случае, мне кажется, что правильным способом улучшения читабельности является использование std::tie(), и мне не ясно, что с ним не так, или (начиная с C ++ 17) также структурированное связывание декларации

auto [ s, sz, cpcty ] = getStringWithSizeAndCapacity();

Если вы не хотите называть неиспользуемые переменные (например, не заинтересованы в емкости), вы можете использовать std::ignore

std::string s;
int sz;

std::tie(s,sz,std::ignore) = getStringWithSizeAndCapacity();

К сожалению std::ignore нельзя использовать (насколько я знаю) с новым структурированным связыванием C ++ 17 (может быть, что-то похожее с C ++ 20?).

...