С ++ явные сигнатуры функций - PullRequest
4 голосов
/ 06 марта 2012

Я хотел бы создать вспомогательную оболочку для структуры типа варианта, чтобы сигнатура типа вызывала необходимые преобразования, например:

variant CreateVariant(bool value);
variant CreateVariant(int value);
variant CreateVariant(char *value);

Проблема в bool и int, поскольку они являются неявно конвертируемыми типами....

Так что для кода, подобного:

variant a = CreateVariant((BOOL)value);
variant a = CreateVariant((__int64)value);
variant a = CreateVariant(1);

Есть некоторые проблемы.

Как мне создать чистую оболочку, если мне нужно обработать bool как логическое ибеззнаковые / подписанные int / uints / longs / longlongs как целочисленные типы?

Для конструкторов классов я могу использовать ключевое слово explicit, но я должен использовать функции внутри обновляемого кода.

1 Ответ

1 голос
/ 06 марта 2012

Поскольку на комментарии ссылаются, ответ на ваш вопрос заключается в различении между "bool" (реальный логический тип) и BOOL (MS typedef для int).

Хотя по более широкой темеЯ сделал то же самое в коде.Если вы работаете на платформе MS, рассмотрите возможность использования _variant_t или CComVariant: оба делают в основном то, что вы хотите.Я закончил тем, что сделал свой собственный класс преобразования с шаблоном, который по умолчанию передавался в базовый родительский класс (в данном случае _variant_t), и добавил специализации для типов конструкторов, которые не имели встроенного преобразования в тип класса MS.Вам нужно будет добавить специализации для каждого типа, для которого нет преобразования в базовом типе, но обычно это не так уж и плохо.

Я должен добавить:

Преимущество этогоДело в том, что не будет никакого неявного преобразования.Если тип соответствует явному переопределению, он будет использован.В противном случае он будет соответствовать шаблону и передан типу MS.Если тип MS не может принять переданный тип, вы получите ошибку во время компиляции и будете знать, что вам нужно.

...