我最近看到像这样的类用于"按需"构造对象,而不必出于各种原因使用动态内存分配.
#include <cassert>
template<typename T>
class StaticObject
{
public:
StaticObject() : constructed_(false)
{
}
~StaticObject()
{
if (constructed_)
((T*)object_)->~T();
}
void construct()
{
assert(!constructed_);
new ((T*)object_) T;
constructed_ = true;
}
T& operator*()
{
assert(constructed_);
return *((T*)object_);
}
const T& operator*() const
{
assert(constructed_);
return *((T*)object_);
}
private:
bool constructed_;
alignas(alignof(T)) char object_[sizeof(T)];
};
Run Code Online (Sandbox Code Playgroud)
这段代码,即将正确对齐的char数组转换为对象指针,被C++ 14标准视为未定义的行为,还是完全没问题?
假设我有一个像这样的强类型枚举类型:
enum class message : int {
JOIN = 0,
LEAVE = 4,
SPAWN = 1,
}
Run Code Online (Sandbox Code Playgroud)
我需要安全地(在这种情况下,安全地意味着丢弃无效的变体)将其从其基础类型(int)进行转换。
为此,我有一个函数可以将其转换为我:
std::optional<message> get_message(int num) {
return num == (int)message::JOIN || num == (int)message::LEAVE || num == (int)message::SPAWN ? (message)num : {};
}
Run Code Online (Sandbox Code Playgroud)
这是可行的,但是编写起来很长并且容易出错,尤其是对于具有大量变体的枚举。
有没有办法在C ++ 17中自动执行此过程?
考虑以下函数:
fn make_array<T>()
where
T: Sized,
{
let bytes = [0u8; std::mem::size_of::<T>()];
}
Run Code Online (Sandbox Code Playgroud)
无论出于何种原因,它都无法编译
fn make_array<T>()
where
T: Sized,
{
let bytes = [0u8; std::mem::size_of::<T>()];
}
Run Code Online (Sandbox Code Playgroud)
尽管事实上Sized
泛型参数有一个trait bound T
。这对我没有任何意义。
为什么会发生这种情况,我该如何解决?
当我尝试使用以下代码从 WAMP 服务器安装连接到我的外部服务器(允许外部连接)时:
const SERVER = 'xxx.xxx.xxx.xx'; // Redacted, the target servers IP
const PORT = 3306;
const DATABASE = 'xxx'; // Redacted
const USERNAME = 'xxx'; // Redacted
const PASSWORD = 'xxx'; // Redacted
const TIMEOUT = 5;
try
{
$pdo = new PDO('mysql:dbname=' . DATABASE . ';host=' . SERVER . ';port=' . PORT, USERNAME, PASSWORD, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_TIMEOUT => TIMEOUT));
}
catch (PDOException $e)
{
echo $e->getMessage();
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
SQLSTATE[HY000] [1045] Access denied for user 'main'@'xxx.xxx.xxx.xx' (using …
我已经安装了DirectX SDK,我想在Visual Studio 2017中的C++项目中使用.我配置了C++ include路径并添加了一个包含DirectX SDK包含文件($(DXSDK_DIR)Include\
)的目录,这些文件正确地解析了C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include\
所有文件所在的位置
但是当#include <d3dx9core.h>
当我检查自己时,我尝试将其正确安装在Include
目录中,它说它无法找到该文件.
我该如何解决?
我用 constexpr 函数在 C++ 中实现了 FNV-1A 函数,但遇到了一个奇怪的问题。
这个版本没有问题:
template<size_t N>
static constexpr uint32_t fnv1a_internal(const char (&data)[N], size_t position, uint32_t state) {
return position >= N - 1 ? state : fnv1a_internal(data, position + 1, (state ^ data[position]) * 16777619UL);
}
template<size_t N>
static constexpr uint32_t fnv1a(const char (&data)[N]) {
return fnv1a_internal(data, 0, 2166136261UL);
}
Run Code Online (Sandbox Code Playgroud)
但是当我将 position 设为 const 通用参数时,就像这样
template<size_t N, size_t Position>
static constexpr uint32_t fnv1a_internal(const char (&data)[N], uint32_t state) {
return Position >= N - 1 ? state …
Run Code Online (Sandbox Code Playgroud)