c++11 - 用户定义的字符串文字的长度作为模板参数?

标签 c++11 generic-programming user-defined-literals

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

// 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/

相关文章:

c++ - C++ 编译器如何在 C++0x 中实现线程本地存储?

c - 在单个函数中初始化具有相同成员名称和成员计数的多个结构

c++ - std::variant的参数归纳

c++ - 是否可以向 C++ 用户定义的文字运算符传递空指针?

c++ - VS2015 中的计时文字

c++ - std::set::iterator 和 std::set::const_iterator 之间是否存在操作差异?

c++ - 声明继承的模板化对象并将它们推回 vector - 优雅的方式?

c++ - std::move into static_pointer_cast:为什么 static_pointer_cast 没有右值引用重载?

swift - 无法将类型 'GenericTableViewController<T, U>' 的值分配给类型 'GenericTableViewController<GenericTableViewCell<_>, _>'

c++ - 宏定义中预处理器标记周围有两个双引号