2015-10-18 108 views
0

有一个斯科特舒尔的实现编译时字符串:转换constexpr编译字符串转换成一个模板字符列表

class str_const { 
    const char* const p_; 
    const std::size_t sz_; 
public: 
    template <std::size_t N> 
    constexpr str_const(const char(&a)[N]) : p_(a), sz_(N-1) {} 
    constexpr char operator[](std::size_t n) { 
     return n < sz_ ? p_[n] : throw std::out_of_range(""); 
    } 
    constexpr std::size_t size() { 
     return sz_; 
    } 
}; 

这是不错,但我想在编译时字符表像string<'H', 'e', 'l', 'l', 'o'>操作。 有没有办法将str_const转换成这样的列表?

我能想到的实现路线是模板和函数。通过模板将str_const转换为其他东西是不可能的,因为str_const对于非类型模板参数是无效的类型。同样也不可能定义这样的函数,因为根据参数的值,它会有不同的返回值string<...>

UPD。编辑摆脱“你的问题可能是重复的”信息,因为从这个问题的文本中可以明显看出,一个字符串不是一个整数。

+0

与此相关的。http://stackoverflow.com/questions/33055791/efficient-way -to-convert-a-compile-time-known-function-argument-to-a-stdintegr –

回答

1

我认为这应该是可能的。您可以在常量表达式中使用这些constexpr字符串类型。所以就像你可以将str[0]传递给期望一个整数参数的模板。

因此,您应该可以创建范围从0到str.size()的模板。然后,你会重复实例化一些构建mpl :: string并重复调用concat的东西。

这需要一段时间才能实现,所以我现在不打算提供代码,但我认为这个想法是可能的。这是我的字符串实现可能有所帮助。该代码有证明它可以在你试图使用它的上下文中使用的测试

https://crazycpp.wordpress.com/2014/10/17/compile-time-strings-with-constexpr/ https://github.com/crazy-eddie/crazycpp/tree/master/20141016-constexprstr

+0

是的,这完全是我最终做的。虽然我无法弄清楚如何将这个可怕的电路隐藏到一个宏中。我确信有人曾经这样做过,而且,老实说,我希望这个问题会被标记为重复。这里有一个草图:http://ideone.com/jggupE –

+1

问题是,我看不到内联可变模板的解压缩方式。 –

+0

@ polkovnikov.ph - 你说得对。现在我想到了,我相信我已经尝试过了。主要问题是函数参数不是constexpr。所以他们不能在不变的情况下使用,即使你只是简单地回报他们。所以也许使用回报你可以创建一个常量范围。 –