利用Scott Schurr 的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);
}
我可以使用 of 的结果为 a ofcaretPos
创建一个 typedef ,其中元组的大小是在字符串中找到的插入符号的数量,每个元组元素都是一个整数常量,其值是插入符号在字符串中的位置。std::tuple
std::integral_constants
这里我手动构造了这个元组:
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>...>;
如何Ns...
使用caretPos
或其他方式生成此处所需的序列?