在C(而不是C++)中实现编译时静态断言的最佳方法是什么,特别强调GCC?
我已经用C++编程了几年,我已经使用了很多STL并且已经创建了我自己的模板类几次以了解它是如何完成的.
现在我正在尝试将模板更深入地集成到我的OO设计中,一个唠叨的想法不断回到我身边:它们只是一个宏,真的......你可以使用#defines实现(而不是UGLY)auto_ptrs,如果你真的想要.
这种思考模板的方式有助于我理解我的代码将如何实际工作,但我觉得我必须以某种方式忽略这一点.宏是邪恶的化身,但"模板元编程"风靡一时.
那么,真正的区别是什么?模板如何避免#define引导你进入的危险,比如
是否有可能对#define宏进行类型检查?例如:
typedef enum
{
REG16_A,
REG16_B,
REG16_C
}REG16;
#define read_16(reg16) read_register_16u(reg16); \
assert(typeof(reg16)==typeof(REG16));
Run Code Online (Sandbox Code Playgroud)
上面的代码似乎不起作用.我究竟做错了什么?
顺便说一下,我正在使用gcc,我可以保证我将永远在这个项目中使用gcc.代码不需要是可移植的.
我的意思是这个,我在c ++中有一个函数,我想将钱存入账户.这个函数应该能够接受浮点数,双精度数,整数等,因为这些都是输入的有效形式,因为我需要的只是一个要存入的数字.
因此,我宣布:
template <typename type>
void Deposit(type t) {...}
Run Code Online (Sandbox Code Playgroud)
现在我唯一的问题是:从理论上讲,这个类的用户可以将char或字符串传递给此函数,并且会产生意想不到的后果.我如何将类型限制为整数,浮点数,双打和短裤?是否可以在函数定义中对此进行限制,以便其他人在使用此函数进行编程时获得编译器/链接器错误而不必使用try{...} catch(...){...}?
C++20std::span是一个非常好的编程接口。但是似乎没有一种简单的方法来获得跨度。这是我想要做的:
#include <iostream>
#include <span>
#include <string>
#include <vector>
void print(std::span<std::span<wchar_t>> matrix) {
for (auto const& str : matrix) {
for (auto const ch : str) {
std::wcout << ch;
}
std::wcout << '\n';
}
}
int main() {
std::vector<std::wstring> vec = {L"Cool", L"Cool", L"Cool"};
print(vec);
}
Run Code Online (Sandbox Code Playgroud)
这不编译。我该怎么做?