2013-07-30 128 views
0

在下面的代碼中,我必須將其轉換爲TDestination作爲boolean_cast以避免編譯器警告(從'VARIANT_BOOL'截斷爲'bool')。這是編譯器問題還是C++問題?模板不同的返回類型

template<typename TDestination, typename TSource> 
TDestination boolean_cast(TSource source) 
{ 
    TDestination destination; 

    static_assert(std::is_same<TDestination, bool>::value || std::is_same<TDestination, VARIANT_BOOL>::value, "destination must be bool or VARIANT_BOOL"); 

    //convert to bool 
    if (std::is_same<TDestination, bool>::value) 
    { 
     if (source) 
      destination = true; 
     else 
      destination = false; 
    } 
    //convert to VARIANT_BOOL 
    else 
    { 
     if (source) 
      destination = (TDestination)VARIANT_TRUE; 
     else 
      destination = (TDestination)VARIANT_FALSE; 
    } 

    return destination; 
} 
+0

爲什麼你在第一時間使用VARIANT_? –

+3

既不是。即使被模板mumbo-jumbo包圍,類型在'if'語句的兩個分支中都是相同的類型。如果你的'TDestination'是'bool',它也是'else'分支中的'bool',即使它的代碼沒有被執行。 –

回答

0

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_; 
} 
+0

KH:我正在使用VARIANT_BOOL,因爲它需要外部COM接口 JW:感謝您的解決方案 – Rocinante8