gpt4 book ai didi

c++ - 用户定义的文字为 C++ 添加了哪些新功能?

转载 作者:IT老高 更新时间:2023-10-28 11:32:08 25 4
gpt4 key购买 nike

C++11介绍 user-defined literals这将允许基于现有文字( inthexstringfloat )引入新的文字语法,以便任何类型都能够有文字表示。

示例:

// imaginary numbers
std::complex<long double> operator "" _i(long double d) // cooked form
{
return std::complex<long double>(0, d);
}
auto val = 3.14_i; // val = complex<long double>(0, 3.14)

// binary values
int operator "" _B(const char*); // raw form
int answer = 101010_B; // answer = 42

// std::string
std::string operator "" _s(const char* str, size_t /*length*/)
{
return std::string(str);
}

auto hi = "hello"_s + " world"; // + works, "hello"_s is a string not a pointer

// units
assert(1_kg == 2.2_lb); // give or take 0.00462262 pounds

乍一看,这看起来很酷,但我想知道它到底有多适用,当我试图考虑使用后缀 _AD 时和 _BC创建日期我发现由于运算符(operator)顺序而存在问题。 1974/01/06_AD将首先评估 1974/01 (作为普通的 int s)和后来的 06_AD (更不用说八月和九月由于八进制原因必须在没有 0 的情况下写的)。这可以通过将语法设为 1974-1/6_AD 来解决。以便运算符(operator)评估顺序有效,但它很笨重。

所以我的问题归结为这个,你觉得这个功能会证明自己吗?您想定义哪些其他文字来使您的 C++ 代码更具可读性?

更新语法以适应 2011 年 6 月的最终草案

最佳答案

下面是使用用户定义的文字而不是构造函数调用的优势的情况:

#include <bitset>
#include <iostream>

template<char... Bits>
struct checkbits
{
static const bool valid = false;
};

template<char High, char... Bits>
struct checkbits<High, Bits...>
{
static const bool valid = (High == '0' || High == '1')
&& checkbits<Bits...>::valid;
};

template<char High>
struct checkbits<High>
{
static const bool valid = (High == '0' || High == '1');
};

template<char... Bits>
inline constexpr std::bitset<sizeof...(Bits)>
operator"" _bits() noexcept
{
static_assert(checkbits<Bits...>::valid, "invalid digit in binary string");
return std::bitset<sizeof...(Bits)>((char []){Bits..., '\0'});
}

int
main()
{
auto bits = 0101010101010101010101010101010101010101010101010101010101010101_bits;
std::cout << bits << std::endl;
std::cout << "size = " << bits.size() << std::endl;
std::cout << "count = " << bits.count() << std::endl;
std::cout << "value = " << bits.to_ullong() << std::endl;

// This triggers the static_assert at compile time.
auto badbits = 2101010101010101010101010101010101010101010101010101010101010101_bits;

// This throws at run time.
std::bitset<64> badbits2("2101010101010101010101010101010101010101010101010101010101010101_bits");
}

优点是运行时异常被转换为编译时错误。
您无法将静态断言添加到采用字符串的位集构造函数(至少在没有字符串模板参数的情况下不能)。

关于c++ - 用户定义的文字为 C++ 添加了哪些新功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/237804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com