boost — Как я могу вернуть другой тип в соответствии со значением параметра в C ++?

Я хочу сделать что-то перегрузить с другим значением параметра в 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")

1

Решение

Существует два типа языков, которые позволяют вам запрашивать:

  • динамические языки
  • зависимо типизированные языки

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> и ни один из этих трех; что именно то, что мы хотим. Затем пользователь должен проверить фактический тип, и если вы прочитаете документацию, вы увидите, что есть несколько способов сделать это.

1

Другие решения

Я думаю, что лучший способ — использовать объединение внутри структуры с полем типа.

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;
};

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

0

По вопросам рекламы [email protected]