As @ n.m. сказано в комментарии, компилятор не прекращает компиляцию ложной ветви if
, поэтому оба ветви должны быть действительными, когда тип назначения - bool
, а когда тип назначения - VARIANT_BOOL
.
Вы можете избежать этой проблемы путем отправки на вспомогательный шаблон, который частично специализируется на целевом типе, например.
template<typename TDestination, typename TSource>
struct boolean_cast_impl; // undefined
template<typename TSource>
struct boolean_cast_impl<bool, TSource>
{
static bool cast(TSource source)
{
return source ? true : false;
}
};
template<typename TSource>
struct boolean_cast_impl<VARIANT_BOOL, TSource>
{
static VARIANT_BOOL cast(TSource source)
{
return source ? VARIANT_TRUE : VARIANT_FALSE;
}
};
template<typename TDestination, typename TSource>
TDestination boolean_cast(TSource source)
{
static_assert(std::is_same<TDestination, bool>::value || std::is_same<TDestination, VARIANT_BOOL>::value, "destination must be bool or VARIANT_BOOL");
return boolean_cast_impl<TDestination, TSource>::cast(source);
}
Или даже просто определение констант правильного типа специализации:
template<typename TDestination, typename TSource>
struct boolean_cast_values; // undefined
template<typename TSource>
struct boolean_cast_values<bool, TSource>
{
static const bool true_ = true;
static const bool false_ = false;
};
template<typename TSource>
struct boolean_cast_values<VARIANT_BOOL, TSource>
{
static const VARIANT_BOOL true_ = VARIANT_TRUE;
static const VARIANT_BOOL false_ = VARIANT_FALSE;
};
template<typename TDestination, typename TSource>
TDestination boolean_cast(TSource source)
{
static_assert(std::is_same<TDestination, bool>::value || std::is_same<TDestination, VARIANT_BOOL>::value, "destination must be bool or VARIANT_BOOL");
typedef boolean_cast_values<TDestination, TSource> values;
return source ? values::true_ : values::false_;
}
почему вы используете VARIANT_ в первую очередь? –
Это не так. Тип является одним и тем же типом в обеих ветвях оператора 'if', даже если он окружен шаблоном mumbo-jumbo. Если ваш 'TDestination' является' bool', это 'bool' внутри ветви' else' тоже, хотя его код не выполняется. –