- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用std::aligned_storage_t
为了解耦分配和构造,所以我写了两个小助手来帮助我做到这一点
#include <type_traits>
template <typename T>
using Uninitialized = std::aligned_storage_t<sizeof(T), alignof(T)>;
template <typename T, typename... Args>
auto get_initialized(Uninitialized<T>& block, Args... args) -> T&
requires(
// If we allow type with default constructor, then it would be ambiguous
// if the caller wants initialization or simply getting reference.
!std::is_default_constructible_v<T> &&
(sizeof...(Args) == 0 || std::is_constructible_v<T, Args...>)
)
{
T* p = (T*) █
if constexpr (sizeof...(Args) > 0)
new (p) T{args...};
return *p;
}
我测试了它
class Obj {
public:
Obj() = delete;
Obj(const char* s) noexcept : m_str(s) {}
void print() noexcept {
std::cout << m_str << std::endl;
}
private:
const char* m_str = nullptr;
};
int main() {
Uninitialized<Obj> obj{};
const char* s = "Test";
Obj& o = get_initialized(obj, s);
o.print();
}
但它失败了。我尝试过 clang、gcc 和 msvc,它们都提示“没有匹配的函数调用”。来自 clang 的投诉
<source>:37:14: error: no matching function for call to 'get_initialized'
Obj& o = get_initialized(obj, s);
^~~~~~~~~~~~~~~
当然,只需添加 <Obj>
该代码可以正常工作。但我只是想在这里节省一些打字。我发现 gcc 的输出在这里提供了一些见解
<source>:37:29: error: no matching function for call to 'get_initialized(Uninitialized<Obj>&, const char*&)'
37 | Obj& o = get_initialized(obj, s);
| ~~~~~~~~~~~~~~~^~~~~~~~
所以我猜问题与构造函数的参数类型有关,我也很好奇为什么s
的类型会这样将被推导为 char*&
而它只是一个 8 字节数据,无需额外费用即可复制。那么有没有办法强制复制参数,就像 std::ref
或std::cref
?
最佳答案
Uninitialized<T>
是一个别名...
所以你的模板实际上是
使用未初始化=;
template <typename T, typename... Args>
auto get_initialized(std::aligned_storage_t<sizeof(T), alignof(T)>& block, Args... args) -> T&
T
此处不可推导(任何具有相同 sizeof
/alignof
的类都是有效的)。
参见Deduction_from_a_type了解更多信息
关于C++ - 为什么编译器不能推断出包含构造函数参数的函数模板的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76066147/
基础问题 我要解决的基本问题是: 我有一个模板参数包 ArgTypes,我需要用包装在 std::optional 中的每个类型创建一个元组。例如:make_optional_tuple应该返回 st
我使用 createEntityAdapter 设置了一个简单的 redux store。初始状态包含实体、ID、状态、错误设置等 const carouselEventAdapter = creat
我有一些(遗留)代码,如下所示: void castFoo(string type, void* foo) { FooA* foo_a = NULL; FooB* foo_b = NULL;
我的代码是 const int *const ptrA = nullptr; auto *ptrB = &ptrA; 我对 const int *const ptrA 的看法是: (*
我目前正在尝试用 C++ 实现 XOR 链表。我尝试使用模板使其通用。编译时会弹出此错误,我无法解决这个问题。 我尝试使用模板在谷歌上搜索 XOR 链表,但到目前为止似乎还没有实现它。 异或链表.h:
我正在尝试找到一种方法来调用多个类成员函数,每个函数都有不同的参数,并且在调用前后会发生某些已知功能。 这个包装函数是我试过的,但是例如对它的最终调用不会编译错误: 'bool Wrapper(Wor
此代码在 上编译成功g++ ( Coliru ) ,但不是 Visual C++ ( rextester ) - 在线和我的桌面。 它是一个更大的 Visual Studio 2015 项目的简化版本
我正在尝试编写一个通用类,它传递一个键 key 对应于一组已知接口(interface)中的一个的键,稍后可以传递一个对象 thing 并类型安全地访问 thing[key]。这是我得到的: inte
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我是一名优秀的程序员,十分优秀!