8

有没有办法得到这样的行为?

// Some definition(s) of operator "" _my_str
// Some definition of function or macro MY_STR_LEN

using T1 = MY_STR_LEN("ape"_my_str);
// T1 is std::integral_constant<std::size_t, 3U>.

using T2 = MY_STR_LEN("aardvark"_my_str);
// T2 is std::integral_constant<std::size_t, 8U>.

似乎不是,因为字符串文字会立即传递给文字运算符模板(2.14.8/5),some_return_type operator "" _my_str(const char*, std::size_t);而不是直接传递给文字运算符模板(2.14.8/5)。该大小函数参数不能用作模板参数,即使它几乎总是一个常量表达式。

但似乎应该有某种方法可以做到这一点。


更新:接受的答案是,如果没有每个文字的额外定义,这是不可能的,对于所要求的 C++11 以及 C++14 和 C++17 来说是准确的。C++20 允许要求的确切结果:

#include <cstdlib>
#include <type_traits>
#include <string_view>

struct cexpr_str {
    const char* ptr;
    std::size_t len;

    template <std::size_t Len>
    constexpr cexpr_str(const char (&str)[Len]) noexcept
    : ptr(str), len(Len) {}
};

// Essentially the same as
// std::literals::string_view_literals::operator""sv :
template <cexpr_str Str>
constexpr std::string_view operator "" _my_str () noexcept
{
     return std::string_view(Str.ptr, Str.len);
}

#define MY_STR_LEN(sv) \
  std::integral_constant<std::size_t, (sv).size()>
4

1 回答 1

6

仔细阅读 C++11 2.14.8 会发现“文字运算符模板”仅适用于数字文字,而不适用于字符串和字符文字。

但是,以下方法似乎使您可以 constexpr 访问字符串长度(但不是指针):

struct MyStr
{
    char const * str;
    unsigned int len;
    constexpr MyStr(char const * p, unsigned int n) : str(p), len(n) {}
};

constexpr MyStr operator "" _xyz (char const * s, unsigned int len)
{
    return MyStr(s, len);
}

constexpr auto s = "Hello"_xyz;

测试:

#include <array>

using atype = std::array<int, s.len>; // OK
于 2013-06-22T16:09:44.677 回答