我需要指定 的线程堆栈大小std::thread
。不幸的是,我不能使用boost::thread
. std::thread
通过在系统中实现pthread
。也许您可以在编译器选项或类似的选项中指定特定文件的线程堆栈大小?
Denver Toha's questions
有这段代码
template <typename T, typename U>
class A
{
public:
explicit A(U v) : field1{}, field2(v) {}
private:
T field1;
U field2;
};
int main()
{
A<int> b("");
}
由 clang14、17 标准收集。我收到编译错误:
类模板“A”的模板参数太少
为什么编译器不自动推断类型?
是否可以将从 systeamd 启动的您自己的守护进程嵌入到 ubuntu 的图形设置 shell 中。有这个的api吗?与内置 NetworkManager 的方式类似
Ubuntu 版本 22.04
std::error_category 有一个 constexpr 构造函数,但它是一个抽象类。因此,它的孩子不能由 constexpr 创建。那么为什么要使用 error_category constexpr 构造函数呢?
这段代码会在 main() 运行之前运行吗?如果m_filed初始化过程中出现异常怎么办?什么时候调用 m_field 析构函数?
class Example {
private:
static int m_field;
}
int Example::m_field = 0;
我想从参数包中填充结构对象,怎么办?也许你可以为此使用 boost::mpl
struct Operation {
int (*ops1)();
int (*ops2)(int);
};
template<auto... Ops>
class Example {
public:
constexpr Example() {
/*
*
* Тут нужно отсортировать Ops и заполнить m_ops
* если в аргументе шаблона есть указатель на функцию неподходящего типа - ошибка компиляции
*
* */
}
private:
Operation m_ops;
};
是否可以根据类模板的类型删除或添加方法声明?我知道可以通过这种方式选择重载,但是甚至可以删除不适合模板类型的方法吗?与概念或sfinae。我不想让整个班级专门为此
编译器可以内联实现在 cpp 文件中的函数吗?在声明站点实现的函数和方法默认是内联的,并且由编译器自行决定构建,但是编译器是否限制将实现放在 cpp 文件中?
是否可以将 boost::intrusive::list 插入 boost::intrusive::list ?我需要合并 2 个列表,没有任何逻辑和排序,显然这可以通过简单地将 list2 的第一个节点插入 list1 在 O(1) 中完成。唯一的问题是如何做到这一点,在库中我只找到了合并方法,该方法在 O(N) 中有效。是否可以将列表插入列表中?
原子写入和读取操作与加载/存储操作有何不同?我一直认为这是同一件事,但现在我有点困惑。
在查看了在标准原子上实现自旋锁的示例后,我感到困惑
struct tas_lock {
std::atomic<bool> lock_ = {false};
void lock() { while(lock_.exchange(true, std::memory_order_acquire)); }
void unlock() { lock_.store(false, std::memory_order_release); }
};
文件说,这就是混乱所在
memory_order_acquire 具有此内存顺序的加载操作对受影响的内存位置执行获取操作:在此加载之前,当前线程中的任何读取或写入都不能重新排序。释放相同原子变量的其他线程中的所有写入在当前线程中可见(请参阅下面的 Release-Acquire 顺序)
我的意思是,获取是一个加载操作(在我对阅读的理解中),它保证了原子性并且任何读写操作都不会在它之前重新排序。
memory_order_release 具有此内存顺序的存储操作执行释放操作:当前线程中的任何读取或写入都不能在此存储之后重新排序。当前线程中的所有写入在获取相同原子变量的其他线程中可见(请参阅下面的 Release-Acquire 排序),并且将依赖项携带到原子变量中的写入在消耗相同原子的其他线程中变得可见(请参阅 Release-Consume下面订购)。
一个解除分配操作,以确保没有读/写操作可以在它之后重新排序。
但是在上面的例子中,写操作是用asquire保证的(在我的理解中,交换是读+写)
while(lock_.exchange(true, std::memory_order_acquire));
鉴于上述情况,加载/释放和读/写的概念不是一回事,它们有何不同?
PS:描述 std::atomic_flag 的文档中的措辞也具有误导性
std::atomic_flag 是一个原子布尔类型。与 std::atomic 的所有特化不同,它保证是无锁的。与 std::atomic 不同,std::atomic_flag 不提供加载或存储操作。
这里写到 atomic_flag 不提供加载/存储操作,当使用 asq / release 保证的相同文档的示例中描述类似的自旋锁时,这不是很清楚这意味着什么
我想使用 std::function 作为 C 函数指针。据我了解,在将仿函数传递给 std:: 函数构造函数的情况下,该仿函数会从调用者的堆栈复制/移动到堆中。我想避免这种动态内存分配并将仿函数作为函数指针传递,我该怎么做?
struct test {
void operator()() {
std::cout << "a" << std::endl;
}
~test() {
std::cout << "destruct" << std::endl;
}
};
int main() {
auto t = test{};
std::function<void()> a = t;
a();
}
该示例显示测试类析构函数被调用了 2 次。
我正在尝试重载 <=> 运算符,但以下代码会引发编译错误
错误:'operator==' 不匹配(操作数类型为 'example' 和 'example')
struct example {
int a{0};
int b{0};
auto operator <=>(const example& other) const{
return a<=>other.a;
}
};
int main() {
example a{1, 2};
example b{1, 3};
a == b;
return 0;
}
同时,如果我写 auto operator <=>(const example& other) const = default;
,不会有编译错误。但是我不能写默认值,因为我需要稍微修改一下逻辑。<> 运算符起作用。
如何在 C++20 概念中检查模板类型中是否存在别名?
struct example {
using alias_t = int;
};
template<class T>
concept example_concept = requires{
T::alias_t;
};
这是一个示例,如果您将示例作为模板参数 ala 传递,则template<example_concept T>
代码将无法编译。如何进行此项检查?
更新
template<class T>
concept future_traits = requires {
typename T::initial_awaitable_t;
typename T::await_awaitable_t;
typename T::final_awaitable_t;
};
template<class return_type>
struct default_traits {
using initial_awaitable_t = std::suspend_always;
using await_awaitable_t = detail::symmetrical_awaitable<detail::promise<return_type, default_traits>>;
using final_awaitable_t = detail::final_awaitable;
};
如何找出goroutine当前正在执行的线程的id?
最近我需要编写一个编译时排序。由于我们项目使用c++17,std::sort不是constexpr,20标准还没有完全支持。
我决定分享我的算法,如果他们改进它或告诉我错误,我会很高兴
这是功能
template<class... Args>
void f(Args... args) {
std::array<int, sizeof...(args)> test = {args...};
}
我希望数组具有参数包中第一个参数的类型。我怎样才能得到这种类型?
如果要将可变数量的枚举/值对传递给函数,该怎么做?像这样试过
template<typename EnumT, typename CharT, std::pair<EnumT, CharT> KeyValueT>
constexpr auto makeStringsMap(KeyValueT... kv)
{
}
所以
template<typename... KeyValueT>
constexpr auto makeStringsMap(KeyValueT... kv)
{
static_assert(std::is_enum_v<decltype(std::get<0>(kv))>);
}
在这两种情况下,编译器都在运行