有没有办法得到这样的行为?
// 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()>