2016-07-23 3 views
0

Я иду из node.js, и мне было интересно, есть ли способ сделать это на C++. Что бы C++ эквивалент:Изменение типов переменных после инициализации C++

var string = "hello"; 
string = return_int(string); //function returns an integer 
// at this point the variable string is an integer 

Так в C++ Я хочу сделать что-то вроде этого ...

int return_int(std::string string){ 
    //do stuff here 
    return 7; //return some int 
} 
int main(){ 
    std::string string{"hello"}; 
    string = return_int(string); //an easy and performant way to make this happen? 
} 

Я работаю с JSON и мне нужно перечислить некоторые строки , Я понимаю, что я могу просто присвоить возвращаемое значение return_int() другой переменной, но я хочу знать, можно ли переназначить тип переменной из строки в int для обучения и удобочитаемости.

+0

Нет, это не возможно (по крайней мере, не в том, «простой и действенный способ сделать это»?). C++ фиксирует любые типы переменных во время компиляции. –

+0

См. Http://stackoverflow.com/questions/1517582/what-is-the-difference-between-statically-typed-and-dynamically-typed-languages ​​ –

+0

Имейте в виду, что для языка не обязательно статически набирается, чтобы быть строго типизированным. Например: JavaScript является динамическим и слабым, что позволяет использовать неявные преобразования типов (например, x = "3" + 5). Python динамичен и сильно, что позволяет использовать явные преобразования типов (либо x = "3" + "5", либо x = 3 + 5, но не смешанные). C++ является статическим, поэтому, как отмечено, нет простого способа, поскольку он не является ожидаемым поведением (вы должны явно объявить тип x во время компиляции) –

ответ

2

На этом языке C++ нет ничего, что допускает это. Переменные не могут изменять свой тип. Тем не менее, вы можете использовать класс-оболочку, которая позволяет его данные изменить тип динамически, например, boost::any или boost::variant (C++ 17 добавляющий std::any и std::variant):

#include <boost/any.hpp> 

int main(){ 
    boost::any s = std::string("hello"); 
    // s now holds a string 
    s = return_int(boost::any_cast<std::string>(s)); 
    // s now holds an int 
} 

#include <boost/variant.hpp> 
#include <boost/variant/get.hpp> 

int main(){ 
    boost::variant<int, std::string> s("hello"); 
    // s now holds a string 
    s = return_int(boost::get<std::string>(s)); 
    // s now holds an int 
} 
+0

Я предполагаю, что 'boost ::: get', т. Е. 3 x': ', это опечатка? –

+0

ОК, с шаблоном магия это возможно, но ISTM не так же удобен, как и для языков, на которых он встроен. Уродливые подобные преобразования, такие как 'boost :: get' и' boost :: any_cast', а также объявление «boost :: variant» делает его немного неудобным, IMO. –

+0

@RudyVelthuis это не шаблонная магия, которая позволяет этому работать. Та же логика может быть выполнена без шаблонов. 'any' в основном содержит указатель на динамически распределенный блок данных, содержащий значение. Присвоение другого типа значения выделяет новый блок. 'variant' - это, по сути, просто безопасный тип. –

2

Это невозможно. C++ - это статически типизированный язык, т. Е. Типы не могут меняться. Это не будет работать с авто или любым другим способом. Вам нужно будет использовать другую переменную для int. В C++ 11 и новее, вы можете сделать:

std::string str = "hello"; 
auto i = return_int(str); 

Или:

int i = return_int(str); 

Во всяком случае, называя целое "строка" это немного странно, если вы спросите меня.

Смежные вопросы