【发布时间】:2017-09-04 20:50:34
【问题描述】:
利用Scott Schurr's str_const 我有一个constexpr 字符串。
class StrConst
{
public:
template<size_t N>
constexpr StrConst(const char (&str)[N])
: str_(str)
, len_(N - 1)
{
static_assert(N > 1, "not a string");
}
constexpr operator const char*() const
{
return str_;
}
constexpr size_t size() const
{
return len_;
}
constexpr char operator[] (size_t i) const
{
return i < len_ ? str_[i] : throw std::out_of_range("invalid index");
}
private:
const char* const str_;
const size_t len_;
};
我还有另一个 constexpr 函数,它返回在字符串中找到的第一个插入符号的位置,从位置 n 开始:
constexpr int caretPos(const StrConst& str, size_t n = 0)
{
if (n == str.size())
return -1;
if (str[n] == '^')
return n;
return caretPos(str, n+1);
}
我可以使用caretPos 的结果为std::integral_constants 的std::tuple 创建一个typedef,其中元组的大小是在字符串中找到的插入符号的数量,每个元组元素都是一个整数常量其值为插入符号在字符串中的位置。
这里我手动构造了这个元组:
int main()
{
constexpr StrConst s("hello^world^");
constexpr int pos1 = caretPos(s);
constexpr int pos2 = caretPos(s, pos1+1);
using P1 = std::integral_constant<int, pos1>;
using P2 = std::integral_constant<int, pos2>;
using PosTuple = std::tuple<P1, P2>;
static_assert(std::tuple_element_t<0, PosTuple>::value == 5, "");
static_assert(std::tuple_element_t<1, PosTuple>::value == 11, "");
}
问题:
我现在想将它推广到任何具有任意数量插入符号的输入字符串。
template<size_t... Ns>
using PosTuple = std::tuple<std::integral_constant<int, Ns>...>;
如何使用caretPos或其他方式生成此处所需的Ns...序列?
【问题讨论】:
标签: c++ c++14 template-meta-programming boost-hana