将参数包解压缩到字符串视图中

时间:2017-11-05 21:09:19

标签: c++ variadic-templates c++17 string-view

可以将char类型的值模板参数包解压缩到(编译时)字符串中。 如何在该字符串中获得string_view

我想做什么:

int main()
    {
    constexpr auto s = stringify<'a', 'b', 'c'>();
    constexpr std::string_view sv{ s.begin(), s.size() };
    return 0;
    }

尝试:

template<char ... chars>
constexpr auto stringify()
    {
    std::array<char, sizeof...(chars)> array = { chars... };
    return array;
    }

错误:

15 : <source>:15:30: error: constexpr variable 'sv' must be initialized by a constant expression
constexpr std::string_view sv{ s.begin(), s.size() };
                         ^~~~~~~~~~~~~~~~~~~~~~~~~
15 : <source>:15:30: note: pointer to subobject of 's' is not a constant expression

有没有办法在main函数中获取行为?

2 个答案:

答案 0 :(得分:3)

它无法作为constexpr工作,因为s数组位于堆栈上,因此在编译时它的地址是未知的。要解决此问题,您可以将s声明为static

Check this solution in online compiler

答案 1 :(得分:0)

这段代码在clang中编译,虽然GCC仍然会抛出(我认为不正确)错误:

#include <iostream>
#include <array>
#include <string_view>

template<char... chars>
struct stringify {
    // you can still just get a view with the size, but this way it's a valid c-string
    static constexpr std::array<char, sizeof...(chars) + 1> str = { chars..., '\0' };
    static constexpr std::string_view str_view{&str[0]};
};

int main() {
    std::cout << stringify<'a','b','c'>::str_view;
    return 0;
}

虽然它会生成关于“子对象”的警告。 (字符......)另一个答案解释了它的工作原理。