2017-06-07 5 views
-2
#include <openpose/utilities/errorAndLog.hpp> 
#include <openpose/utilities/string.hpp> 

namespace op 
{ 
    template<typename T> 
    std::string toFixedLengthString(const T number, const unsigned long long stringLength) 
    { 
     try 
     { 
      const auto numberAsString = std::to_string(number); 
      if (stringLength > 0) 
      { 
       if (number < 0) 
        error("toFixedLengthString: number cannot be <= 0, in this case it is: " + numberAsString + ".", __LINE__, __FUNCTION__, __FILE__); 

       const auto zerosToAdd = stringLength - numberAsString.size(); 
       if (zerosToAdd < 0) 
       { 
        const auto errorMessage = "toFixedLengthString: number greater than maximum number of digits (stringLength): " 
              + numberAsString + " vs. " + std::to_string(stringLength) + "."; 
        error(errorMessage, __LINE__, __FUNCTION__, __FILE__); 
       } 

       return { std::string(zerosToAdd, '0') + numberAsString}; 
      } 
      else 
       return numberAsString; 
     } 
     catch (const std::exception& e) 
     { 
      error(e.what(), __LINE__, __FUNCTION__, __FILE__); 
      return ""; 
     } 
    } 

    // Signed 
    template std::string toFixedLengthString<char>(const char number, const unsigned long long stringLength); 
    template std::string toFixedLengthString<signed char>(const signed char number, const unsigned long long stringLength); 
    template std::string toFixedLengthString<short>(const short number, const unsigned long long stringLength); 
    template std::string toFixedLengthString<int>(const int number, const unsigned long long stringLength); 
    template std::string toFixedLengthString<long>(const long number, const unsigned long long stringLength); 
    template std::string toFixedLengthString<long long>(const long long number, const unsigned long long stringLength); 
    // Unsigned 
    template std::string toFixedLengthString<unsigned char>(const unsigned char number, const unsigned long long stringLength); 
    template std::string toFixedLengthString<unsigned short>(const unsigned short number, const unsigned long long stringLength); 
    template std::string toFixedLengthString<unsigned int>(const unsigned int number, const unsigned long long stringLength); 
    template std::string toFixedLengthString<unsigned long>(const unsigned long number, const unsigned long long stringLength); 
    template std::string toFixedLengthString<unsigned long long>(const unsigned long long number, const unsigned long long stringLength); 
} 

これはsrcファイルであり、ヘッダーファイルには対応する機能があります。なぜ、彼は以下のことを定義する必要があり、単にテンプレート関数全体をヘッダーファイルに入れる必要はありません。このようにC++でテンプレート関数を定義するのはなぜですか?

+0

このように定義する必要はありません。それがヘッダーファイルにあるのがより理にかなっています。そのように定義することはできますが、それを使用するたびにインスタンス化を行う必要があることを意味します。 – Tas

+0

https://stackoverflow.com/questions/2351148/explicit-instantiation-when-is-it-usedとhttps://stackoverflow.com/questions/13068993/when-would-you-use-template-explicit-を参照してください。インスタンス化 – Curious

答えて

0

(私はOpenPose作家の一人です)

主な理由:私はHPPでそれを定義する場合は、毎回あなたのコードに小さな変更を加えるすべてのコンパイルに多くの時間を待つ必要がありますあなたのコードのテンプレート。

このように、これらのテンプレートは、コードを変更するたびにではなく、一度だけ(OpenPoseを初めてコンパイルするとき)コンパイルされます。

サイドノート:OpenPoseのための提案やコメント、あまりにも多くのコード行を私は受け入れることができます。

関連する問題