如何从boost :: bind的类型获取参数类型(c ++ 11不可用)

时间:2014-08-08 15:24:15

标签: c++ boost

我正在拧一个泛型类来通过字符串键提取SrcT类型的东西,将其转换为类型TargetT然后返回。像:

class Foo
{
public:
  bool get(const char* key, std::string& str)
  {
    if (std::string(key) == "found")
    {
        str = "stringA";
        return true;
    }
    return false;
  }

  bool get(const char* key, int& a)
  {
    a = 100;
    return true;
  }
};

class Bar
{
public:
  template <typename Converter>
  typename Converter::result_type extract(const char* key, Converter converter)
  {
    typedef typename Converter::first_argument_type SrcT;  // <- HERE IS THE ERROR
    typedef typename Converter::result_type TargetT;
    SrcT temp;
    if (_foo.get(key, temp)) 
    {
      TargetT target = converter(temp);
      return target;
    }
    else
    {
      throw std::runtime_exception("ah");
    }
  }

  Foo _foo;
};

struct Converters
{
  static int toInt(const std::string& str) { return str.size(); }
  static float toFloat(int a) { return 100.0 + a; }
};

BOOST_AUTO_TEST_CASE(Nothing)
{
  Bar bar;
  const int saveHere = bar.extract("found", boost::bind(&Converters::toInt, _1));
  BOOST_CHECK_EQUAL(saveHere, 7); // 7=sizeof("stringA")
}

TargetT是从转换器类型中推断出来的,但没有关于SrcT的线索。

感谢任何帮助。

更新 在检查了boost / bind.hpp和boost / bind / bind_template.hpp之后,看起来没有暴露这样的东西。

1 个答案:

答案 0 :(得分:1)

尝试:

typedef typename boost::function_traits<Converter>::arg1_type SrcT;