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

但我不希望在提升的依赖。

+0

1.大小应该(可能)是'3 + 2 * sizeof(T)'。 2.在这种情况下'\ 0'增加了第二个无用的空终止符。我认为你不想拥有它。 3.我会说你根本不需要初始化数组。只需在每次通话时将您的号码“sprintf”输入即可。 4.如果您使用C++,为什么不使用'std :: string's而不是'char'数组? – HolyBlackCat

+0

@HolyBlackCat这只是一个示范例子。 3 + 2 * sizeof(T)的确是当前植入用于尺寸的。我忘记了隐式字符串文字。感谢您的提醒。我使用的是受此解决方案启发的实现:http://stackoverflow.com/a/33447587因为这是一个性能敏感的应用程序。结果被调用函数复制,所以我不想额外的字符串分配。 –

回答

2

不是一定要了解你想要什么,但是...如果你想使str初始值创建编译的时候,如果你接受toStr()通话和(在下面的例子中toStrH())辅助功能的C++ 14例如如下

#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); 
} 

如果你需要一个C++ 11的解决方案,替代std::make_index_sequence()std::index_sequence并不困难。

+0

啊哈!这相当聪明地使用了逗号运算符。 –