有没有办法获得这样的行为?
// 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>.
似乎不是,因为字符串文字会立即传递给 some_return_type operator "" _my_str(const char*, std::size_t);
并且从不使用文字运算符模板 (2.14.8/5)。该 size 函数参数不能用作模板参数,即使它几乎总是一个常量表达式。但似乎应该有某种方法来做到这一点。
更新:接受的答案是,如果没有每个文字的额外定义,这是不可能的,对于 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()>
最佳答案
仔细阅读 C++11 2.14.8 会发现“文字运算符模板”仅考虑用于数字文字,而不用于字符串和字 rune 字。
但是,以下方法似乎使您可以使用 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
关于c++11 - 用户定义的字符串文字的长度作为模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17252543/