2013-05-22 85 views
0

我試圖得到這個工作模板函數:其只接受字符串或算術

template<class Type> 
typename boost::enable_if< boost::mpl::or_< 
boost::is_arithmetic<Type>, 
is_string<Type> > >::type 
get(const std::string &argPath, const Type &argDefault) { 
    bool caught = false; 
    std::stringstream ss; 
    Type value; 

    try { 
     value = ptree_.get<Type>(argPath); 
    } catch(ptree_bad_path &e) { 
     caught = true; 
    } 

    if(caught) 
     value = argDefault; 

    ss << value; 
    parameters_.insert(std::pair<std::string, std::string>(argPath, ss.str())); 
    return value; 
} 

我用下面的IS_STRING型特點:Type trait for strings

我的目標是我的Type限制字符串或算術類型,以便我可以將它推到我的stringstream

所以這個版本,但是當我嘗試使用它,它返回以下錯誤:

error: void value not ignored as it ought to be

In member function ‘typename boost::enable_if, is_string, mpl_::bool_, mpl_::bool_, mpl_::bool_ >, void>::type FooClass::get(const std::string&, const Type&) [with Type = uint8_t]’

error: return-statement with a value, in function returning 'void'

這裏是我嘗試使用它:

FooClass f; 
item_value = f.get("tag1.tag2.item", DEFAULT_ITEM_VALUE); 

任何幫助表示讚賞,提前致謝!

回答

4

http://www.boost.org/doc/libs/1_53_0/libs/utility/enable_if.htmlenable_if有第二個參數默認爲無效:您需要在您的enable_if的返回類型

template <bool B, class T = void> 
struct enable_if_c { 
    typedef T type; 
}; 

在我看來。 (現在默認爲空)

template<class Type> 
typename boost::enable_if< boost::mpl::or_< 
    boost::is_arithmetic<Type>, 
    is_string<Type> >, 
Type >::type 
get(const std::string &argPath, const Type &argDefault); 
+0

你說得對,它現在按預期工作!非常感謝,你做了我的一天! – Syffys