2012-09-11 9 views
5

は、次のような機能を考える:function1に渡されたタイプがすでにstd::stringであれば、オーバーヘッドのどのような種類が発生している ID boost :: lexical_castの実行にはどのようなオーバーヘッドがありますか?

template< typename T > 
void function1(const T &t) 
{ 
    function2(boost::lexical_cast<std::string>(t)); 
} 

オーバーヘッドは種類によって異なりますが、私はlexical_castになっていますか?

キャストをバイパスするためにオーバーロードされた関数を作成する必要はありませんか?私はlexical_castが改訂上にいくつかの最適化を受けていることを理解して例えば:

void function1(const std::string &t) 
{ 
    function2(t); 
} 

template< typename T > 
void function1(const T &t) 
{ 
    function1(boost::lexical_cast<std::string>(t)); 
} 

ブーストのバージョンでは、あなたの答えにreleventすることができます。

+3

まず第一に、非常に簡単である、lexical_cast_copy::lexical_cast_impl呼び出されます、しないでください関数テンプレートの特殊化、*ちょうどオーバーロード*。 – Xeo

+0

@ Xeo良い点[ここで説明](http://stackoverflow.com/questions/7108033/template-specialization-vs-function-overloading)編集されました。 –

答えて

4

ドキュメントではこのトピックについて何も提供していないので、lexical_castソース(1.51.0)を掘り下げてコンパイル時にタイプをチェックし、特定の「キャスタークラス」を決定する変換。ソースとターゲットが同じ場合、この "キャスタークラス"は単に入力を返します。

擬似成文化(boost/lexical_cast.hpp:2268)を、ソースからの簡素化:

template <typename Target, typename Source> 
Target lexical_cast(const Source &arg) 
{ 
    static if(is_character_type_to_character_type<Target, src> || 
       is_char_array_to_stdstring<Target, src> || 
       is_same_and_stdstring<Target, src>) 
    //   ^-- optimization for std::string to std::string and similar stuff 
    { 
     return arg; 
    } 
    else 
    { 
     /* some complicated stuff */ 
    } 
} 

は、私が直接作っているキャスト、しかし、通常は選択lexical_cast_do_cast「キャスタークラス」を通して見ている他のアイデンティティのための任意の最適化を見ることができません私の頭が痛い。 :(

+0

@Drew:「他のアイデンティティキャストの最適化を直接見ることはできませんが、それは引数を返すだけです。 – Xeo

1

http://www.boost.org/doc/libs/1_51_0/doc/html/boost_lexical_cast/performance.html

文字列に文字列が非常に高速で、このリンクを考えてみましょう次のコード・ブロックの10000回の繰り返しのミリ秒単位の

すべてのテスト対策の実行速度:

typedef BOOST_DEDUCED_TYPENAME ::boost::type_traits::ice_or< 
      ::boost::detail::is_xchar_to_xchar<Target, src >::value, 
      ::boost::detail::is_char_array_to_stdstring<Target, src >::value, 
      ::boost::type_traits::ice_and< 
       ::boost::is_same<Target, src >::value, 
       ::boost::detail::is_stdstring<Target >::value 
      >::value 
    > shall_we_copy_t; 

私たちの場合、shall_we_copy_t::valueは、3番目のケースが私たちのために働くので、真となります(Targetsrcは等しいタイプであり、Targetタイプはstd::basic_stringです)。

typedef BOOST_DEDUCED_TYPENAME ::boost::mpl::if_c< 
     shall_we_copy_t::value, 
     ::boost::detail::lexical_cast_copy<src >, 
     BOOST_DEDUCED_TYPENAME ::boost::mpl::if_c< 
      shall_we_copy_with_dynamic_check_t::value, 
      ::boost::detail::lexical_cast_dynamic_num<Target, src >, 
      ::boost::detail::lexical_cast_do_cast<Target, src > 
     >::type 
    >::type caster_type; 

shall_we_copy_t::valueが真である、ので、私たちのcaster_typeだからlexical_cast_copy

return caster_type::lexical_cast_impl(arg); 

なり、

template <typename Source> 
    struct lexical_cast_copy 
    { 
     static inline Source lexical_cast_impl(const Source &arg) 
     { 
      return arg; 
     } 
    }; 
関連する問題