当头文件包含如下所示的模板变量时会发生什么:
template <class T>
std::map<T, std::string> errorCodes = /* some initialization logic */;
Run Code Online (Sandbox Code Playgroud)
这个变量使用安全吗?对此进行了一些研究,我发现:
inline改变了规则,但 c++20 有不同的行为(?)那么是哪一个呢?
鉴于strstream有以下构造函数:
strstream( char* s, int n, std::ios_base::openmode mode);
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以直接在“只读”模式下使用标准字符串底层的缓冲区,以避免缓冲区重新分配产生奇怪的副作用:
std::string buffer("Dummy Data");
std::strstream ss(
const_cast<char *>(buffer.data()), buffer.length(), std::ios_base::in);
std::string other;
ss >> other;
std::cout << other << std::endl;
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,上面的代码最终生成了other一个空字符串。在文档中有一个示例,其中C 数组用作 的静态缓冲区strstream,所以我想知道它不能使用缓冲区内容的原因是什么std::string?
注意:我无法使用,std::stringstream因为相关平台的 VS 实现仅限于 4GB 大小,如此处所述
更新:
我发现使用std::ios_base::app(如示例中所示)几乎可以使我的代码正常工作。现在最大的问题(根据我收到的评论)是它strstream已被长期弃用。也许boost iostreams中有一些东西可以提供帮助,但我不太了解该库。
C++草案参数20.12.7.3内容如下:
high_resolution_clock可能是system_clock或的同义词steady_clock
当然,这可能只是强制要求,但我想知道:
high_resolution_clocktypedef的其他东西有什么意义吗?system_clock,high_resolution_clock并且typedef再次违反解决方案?std::move和之间的区别std::forward是众所周知的,我们使用后者来保留转发对象的值类别,并使用前者转换为右值引用以启用移动语义.
在有效的现代C++中,存在一种指导原则
std::move在rvalue引用std::forward上使用,在通用引用上.
但在以下场景中(以及我们不想更改值类别的场景),
template <class T>
void f(vector<T>&& a)
{
some_func(std::move(a));
}
Run Code Online (Sandbox Code Playgroud)
哪里a不是转发引用而是简单的右值引用,执行以下操作不是完全相同的吗?
template <class T>
void f(vector<T>&& a)
{
some_func(std::forward<decltype(a)>(a));
}
Run Code Online (Sandbox Code Playgroud)
因为这可以很容易地封装在像这样的宏中,
#define FWD(arg) std::forward<decltype(arg)>(arg)
Run Code Online (Sandbox Code Playgroud)
如此总是使用这个宏定义不方便吗?
void f(vector<T>&& a)
{
some_func(FWD(a));
}
Run Code Online (Sandbox Code Playgroud)
写这两种方式不完全相同吗?
说我有一个固定的内存缓冲区
char *buffer;
Run Code Online (Sandbox Code Playgroud)
我使用placement new在缓冲区中分配我的结构
struct S
{
std::tuple<int, double, char> m_data;
auto getRecord()
{
return m_data;
}
};
S *newS = new(buffer + offset)S;
Run Code Online (Sandbox Code Playgroud)
我知道我应该手动调用这些已分配项目的析构函数,但是如果没有涉及bookeeping /资源管理,是否可以省略它?换句话说,如果使用缓冲区的类的析构函数没有执行任何操作(类似于~S()上面的内容),是否可以跳过此步骤?如果是这种情况,我可以重用缓冲区而不破坏以前的租户吗?
在读这篇文章时,我惊讶于某个程度的元编程可以为你的班级布局做些什么.我必须承认,如果我不得不陈述我的理解,我不会完全掌握建议的最佳布局是什么:
通过降序排列来排序类成员,即具有最大
alignof结果的类型首先等
如果我弄错了,请随意纠正我(如果你有一个简短的解释为什么会发生这种情况会更好,我无法在我的问题中复制粘贴大部分理由),但我的问题是关于另一个话题:
任何库实现std::tuple都有这样的布局优化吗?
如果没有,是否有任何标准的代数数据类型,除了编写这样的机器之外,还有另一种方法可以为我的班级做这个吗?
我正在阅读复制文章(以及它应该如何在C++ 17中得到保证),这让我有点困惑(我不确定我知道我以前认识的事情).所以这是一个最小的测试用例:
std::string nameof(int param)
{
switch (param)
{
case 1:
return "1"; // A
case 2:
return "2" // B
}
return std::string(); // C
}
Run Code Online (Sandbox Code Playgroud)
我看到它的方式,情况A和B对返回值执行直接构造,因此复制省略在这里没有意义,而案例C不能执行复制省略,因为有多个返回路径.这些假设是否正确?
另外,我想知道是否
std::string retval;总是返回一个或写入的情况下A,并B作为return string("1")等)"1"是暂时的,但我假设它被用作构造函数的参数std::stringreturn{},这会是一个更好的选择吗?)我有一个要优化的函数,我无法从中得到导数或 Hessian 或 Jacobian(因此标题中的“黑匣子”)。假设我的函数如下所示:
def my_fun(some_int, some_other_int, some_string):
return float(some_int + some_other_int + len(some_string))
Run Code Online (Sandbox Code Playgroud)
请注意,我仅执行强制转换以表明该函数返回浮点数。
搜索空间/约束/边界(或者无论您如何称呼它)将是:
some_int = [1..10] # int interval
some_other_int = [1, 2, 3] # int discrete
some_string = ["methodA", "methodB", "methodC"] #discrete
Run Code Online (Sandbox Code Playgroud)
我应该如何用Python表达这个问题?这是我迄今为止搜索过的内容:
有什么想法吗?
我一直在寻找到任务流对用户友好的API来构建并行C ++程序。尽管功能强大,但我找不到使用此框架构建并行管道的示例。
为了消除歧义,Parallel and Distributed Programming Using C++一书将管道thead模型定义为:
一种分阶段处理输入流的流水线方法。每个阶段都是一个线程,在输入单元上执行工作。当输入单元经过所有阶段后,则输入的处理完成。
任务流可以做到这一点吗?如果是,如何,如果不是,是否有其他选择?
我主要使用 C++,想要为项目实现服务器-客户端通信。虽然不太精通分布式计算,但我尝试过各种工具组合,例如 SocketIO 服务器(JS 中)+ C++ 客户端库或 IXWebSocket。我也不想在 Boost.Asio 中从头开始实现所有内容。
据我所知,uWebSockets是 C++ 中性能最高且符合标准的解决方案。问题是只有一个服务器库可用。我知道“任何”兼容的 Web 套接字实现都能够与 uWebSockets 服务器一起使用,但是:
c++ ×9
c++11 ×3
api ×1
c++-chrono ×1
c++17 ×1
c++20 ×1
python ×1
scipy ×1
stl ×1
stringstream ×1
templates ×1
tuples ×1
uwebsockets ×1