模板化函数,只接受字符串或算术

时间:2013-05-22 08:22:37

标签: c++ templates boost typetraits

我正试图让它发挥作用:

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);

感谢任何帮助,提前谢谢!

1 个答案:

答案 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);