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

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

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

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

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

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

4 ответа

Решение

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

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

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

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

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

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

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

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

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

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

os << ( condition ? var1 : var2 )

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

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

MyClassInstance->Foo( booleanValue ? boost::any(24) : boost::any("a string") );
Другие вопросы по тегам