Я хочу сделать что-то перегрузить с другим значением параметра в C ++.
Что-то вроде динамического языка, такого как Python:
def foo(str):
if str == "a":
return str
if str == "b":
return true
if str == "c":
return 1
Есть ли какой-то шаблон RTTI в C ++, чтобы он работал?
Boost :: любые потребности влияют на определение типа при вызове функции:
boost::any foo() {...}
auto result = boost::any_cast<int>(foo("c"));
Как я могу определить результат var без последствий дать ‘int’?
Другими словами, я хочу сделать эту семантику ниже:
result = foo("a")
Существует два типа языков, которые позволяют вам запрашивать:
C ++ не является ни тем, ни другим: сигнатура функции никогда не зависит от значения переданных ей аргументов. Однако это может зависеть от типа аргументов или значения параметров нетипового шаблона:
struct A{}; struct B{}; struct C{};
auto foo(A) -> std::string;
auto foo(B) -> bool;
auto foo(C) -> int;
Если вы действительно хотите, чтобы во время выполнения был выбран правильный тип, то статически тип результата функции — это объединение типов, которые она может вернуть; это можно выразить чисто, используя boost::variant
(что является синтаксическим сахаром для тегового объединения):
auto foo(std::string const&) -> boost::variant<bool, int, std::string>;
Конечно, это означает, что результат это boost::variant<bool, int, std::string>
и ни один из этих трех; что именно то, что мы хотим. Затем пользователь должен проверить фактический тип, и если вы прочитаете документацию, вы увидите, что есть несколько способов сделать это.
Я думаю, что лучший способ — использовать объединение внутри структуры с полем типа.
enum var_type{X_BOOL,X_INT,X_DOUBLE,X_STRING /*add more if needed*/};
struct var{
var_type type;
union{
bool bool_var;
int int_var;
double dbl_var;
string str_var;
/*add more here if needed...*/
}var;
};
когда вы устанавливаете переменную, вы должны также установить тип, и когда вы получите это как возвращаемое значение, вы должны проверить тип и взять переменную в соответствии с ним.