Тернарный оператор и сигнатура функции

Допустим, у меня есть класс C ++ с двумя функциями, такими как

class MyClass
{
bool Foo(int val);
bool Foo(string val);
}

Можно ли использовать троичный оператор, как это

MyClassInstance->Foo(booleanValue?24:"a string");

и имеют другую функцию MyClass вызывается в зависимости от значения booleanValue?

9

Решение

Не с троичным оператором. Тип троичного выражения является общим типом его второго и третьего операндов; если у них нет общего типа, вы не можете его использовать. Так что просто используйте обычный if заявление:

if (booleanValue)
MyClassInstance->Foo(24);
else
MyClassInstance->Foo("a string");
22

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

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

Поскольку нет общего типа для int а также char const *код даже не скомпилируется (как вы наверняка заметили, когда тестировали это).

(Вам может быть приятно узнать, что троичное условное выражение используется именно из-за этой семантики в реализации std::common_type шаблон класса черты, вместе с decltype.)

(Если условие известно статически, такие как sizeof(int) != 7затем вы можете использовать специализацию шаблонов для написания похожего кода, который делает выполнить условное разрешение перегрузки, но, конечно же, статически.)

7

Нет. Чтобы выполнить разрешение перегрузки, компилятор спросит «какой тип booleanValue?24:"a string"? ». На этот вопрос нельзя ответить.

5

Нет, это не разрешено.

Перегрузки происходят во время компиляции, поэтому они не могут работать во время выполнения.

В коде нет ничего общего, что вы хотели бы сделать именно это, однако иногда с iostream возникает желание сделать что-то вроде:

os << ( condition ? var1 : var2 )

где var1 и var2 имеют разные типы. Это также не работает.

Вы могли бы сделать:

MyClassInstance->Foo( booleanValue ? boost::any(24) : boost::any("a string") );
5
По вопросам рекламы [email protected]