1

次のようなコードを使用して、文字列-> cv::Point 変換を処理するように lexical_cast を拡張しようとしています。

#include <iostream>
#include <opencv2/opencv.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>

namespace boost {
  template<>
    cv::Point2f lexical_cast(const std::string &str) {
      std::vector<std::string> parts;
      boost::split(parts, str, boost::is_any_of(","));
      cv::Point2f R;
      R.x = boost::lexical_cast<float>(parts[0]);
      R.y = boost::lexical_cast<float>(parts[1]);
      return R;
    }
}

int main(int argc, char **argv) {
  auto p = boost::lexical_cast<cv::Point2f>(std::string("1,2"));
  std::cout << "p = " << p << std::endl;
  return 0;
}

そして、それはうまく機能します..しかし、cv::Point2f実際にはcv::Point_<T>、Tがint、float、doubleなどになる可能性があります.とにかく、そのテンプレート化された引数をlexical_castに公開する方法を見つけることができないため、すべてを処理できる単一のlexical_cast関数を持つことができますcv::Point_<T>種類。

4

1 に答える 1

1
template <typename T>
struct point_type {};

template <typename T>
struct point_type<cv::Point_<T>> { using type = T; };

namespace boost {
  template <typename T, typename U = typename point_type<T>::type>
    T lexical_cast(const std::string &str)
    {
      std::vector<std::string> parts;
      boost::split(parts, str, boost::is_any_of(","));
      T R;
      R.x = boost::lexical_cast<U>(parts[0]);
      R.y = boost::lexical_cast<U>(parts[1]);
      return R;
    }
}

デモ


のこの暗黙的な 2 番目のテンプレート パラメーターが気に入らない場合は、前の少し複雑なソリューションを使用しますlexical_cast

#include <type_traits>

template <typename T>
struct is_point : std::false_type {};

template <typename T>
struct is_point<cv::Point_<T>> : std::true_type {};

template <typename T>
struct point_type;

template <typename T>
struct point_type<cv::Point_<T>> { using type = T; };

namespace boost {
  template <typename T>
    auto lexical_cast(const std::string &str)
      -> typename std::enable_if<is_point<T>::value, T>::type
    {
      std::vector<std::string> parts;
      boost::split(parts, str, boost::is_any_of(","));
      using U = typename point_type<T>::type;
      T R;
      R.x = boost::lexical_cast<U>(parts[0]);
      R.y = boost::lexical_cast<U>(parts[1]);
      return R;
    }
}

デモ 2

于 2014-10-09T18:26:51.043 に答える