我正试图让它发挥作用:
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
。
所以这构建,但是当我尝试使用它时,它会返回以下错误:
错误:无法忽略void值,因为它应该是
在成员函数'typename中 提高:: enable_if, is_string,mpl _ :: bool_,mpl _ :: bool_, mpl _ :: bool_&gt;,void&gt; :: type FooClass :: get(const std :: string&amp ;,, const Type&amp;)[with Type = uint8_t]'
错误:带有值的return语句,函数返回'void'
以下是我尝试使用它的方法:
FooClass f;
item_value = f.get("tag1.tag2.item", DEFAULT_ITEM_VALUE);
感谢任何帮助,提前谢谢!
答案 0 :(得分:4)
从http://www.boost.org/doc/libs/1_53_0/libs/utility/enable_if.html开始,enable_if
有第二个默认为void的参数:
template <bool B, class T = void>
struct enable_if_c {
typedef T type;
};
在我看来,您需要在enable_if中包含返回类型。 (现在默认无效。)
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);