0

に基づいて静的な文字を初期化私はこのような何かをしたい:は、テンプレートパラメータ

template<typename T> 
const char * toStr(T num) 
{ 
    thread_local static char rc[someval*sizeof(T)] str = "0x000...\0"; // num of zeros depends on size of T 
    // do something with str 
    return str; 
} 

私は私がしなければならないと思い、いくつかのテンプレートメタプログラミングがあると推測しているが、私は開始する場所がわからないんだけど。

編集:

私はここに関連する質問が見つかりました:How to concatenate a const char* in compile time

をしかし、私はブーストに依存したくありません。あなたが受け入れる場合、あなたがしたいけど...あなたはstr初期値は、コンパイル時に作成されることをしたい場合や何をすべきか理解することが

+0

1.サイズは(おそらく) '3 + 2 * sizeof(T)'でなければなりません。 2.この場合、 '\ 0'は2番目の無駄なヌルターミネータを追加します。私はあなたがそれを望むとは思わない。 3.私はあなたが配列を全く初期化する必要はないと言っています。あなたの電話番号を呼び出しごとに 'sprintf'してください。 4. C++を使っているのであれば、 'char'配列の代わりに' std :: string'を使わないのはなぜですか? – HolyBlackCat

+0

@HolyBlackCatこれはほんの一例です。 3 + 2 * sizeof(T)は実際に現在の移植がサイズに使用しているものです。私は暗黙の文字列リテラルを忘れていました。念押し有難う。私は、このソリューションに触発された実装を使用しています。これはパフォーマンスに影響を受けやすいアプリケーションであるためです:http://stackoverflow.com/a/33447587結果は呼び出し関数によってコピーされるので、余分な文字列の割り当ては必要ありません。 –

答えて

2

わからないことtoStr()コールと(次の例ではtoStrH())ヘルパー関数C++ 14例では、C++ 11のソリューションを必要とする場合は、std::make_index_sequence()を代用してstd::index_sequenceは難しいことではありません

#include <utility> 

template <typename T, std::size_t ... I> 
const char * toStrH (T const & num, std::index_sequence<I...> const &) 
{ 
    static char str[3U+sizeof...(I)] { '0', 'x', ((void)I, '0')..., '\0' }; 

    // do someting with num 

    return str; 
} 

template <typename T> 
const char * toStr (T const & num) 
{ return toStrH(num, std::make_index_sequence<(sizeof(T)<<1U)>{}); } 

int main() 
{ 
    toStr(123); 
} 

に従います。

+0

Aha!これはカンマ演算子の賢明な使用です。 –

関連する問題