使用“旧”C++ 编译模型组织和构建项目通常遵循一些常见做法:
include目录中。src目录中当然,有许多不同的方法可以实现这一点,但这里的要点是:您将库二进制文件和公共标头作为纯文本分发。
现在有了模块,编译模型可以发生巨大的变化。但到目前为止我发现的一切都只解释了如何在封闭的项目中使用模块 - 没有分发,没有外部依赖。
现在可以将属于特定模块的所有内容放在单个文件中(这会有一些好处,例如避免重复声明)。这就提出了一个问题:我必须分发什么才能让其他人使用我的图书馆?我可以保密哪些部分?也许这可以通过实施单位解决?
所以 C++20 引入了它,据我所知,它在各个方面std::jthread都比它更好。std::thread因此,除了常见的限制(例如 C++20 的可用性、实现质量、与库的交互等)之外,是否存在std::thread更好的选择?
在 Meeting C++ 2019 上,Jon Kalb 发表了关于模板技术的演讲,并提到了策略类。来源见这里:https : //youtu.be/MLV4IVc4SwI?t=1815
有问题的有趣代码片段是:
template<class T, class CheckingPolicy>
struct MyContainer : private CheckingPolicy
{
...
}
Run Code Online (Sandbox Code Playgroud)
我经常看到这种类型的设计,我想知道这里的继承是否比组合有任何真正的优势。在我的个人经验中,我听说过很多关于优先组合而不是继承范式的内容。所以我写代码的方式更像是这样:
template<class T, class CheckingPolicy>
struct MyContainer
{
CheckingPolicy policy;
...
}
Run Code Online (Sandbox Code Playgroud)
不会涉及任何虚拟功能。不过,如果您能分享一些见解,我将不胜感激。我对内存布局的差异及其影响特别感兴趣。如果CheckingPolicy没有数据成员,而只有check方法或重载的调用运算符,会有所不同吗?
据我所知,[[maybe_noreturn]]C++ 中没有属性。
我有一个如下所示的函数:
void func() {
try {
do_something();
} catch (const std::exception& e) {
std::exit(1);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我标记func为[[noreturn]]我会遇到 UB 的快乐案例。当我没有从未标记为 的函数返回时,这是 UB 吗[[noreturn]]?
或者是否有其他语言结构、编译器扩展或库可以实现类似的功能[[maybe_noreturn]]?
Lark 解析器预定义了一些常见的终端,包括一个字符串。它的定义如下:
_STRING_INNER: /.*?/
_STRING_ESC_INNER: _STRING_INNER /(?<!\\)(\\\\)*?/
ESCAPED_STRING : "\"" _STRING_ESC_INNER "\""
Run Code Online (Sandbox Code Playgroud)
我明白_STRING_INNER。我也明白ESCAPED_STRING是如何组成的。但我真的不明白的是_STRING_ESC_INNER。
如果我正确阅读了正则表达式,它只是说每当我找到两个连续的文字反斜杠时,它们前面不能有另一个文字反斜杠?
如何将这两者组合成一个正则表达式?
语法是否只需要在字符串数据中允许转义双引号?
我想在SQLite数据库中的所有表上运行自定义函数.该函数或多或少相同,但取决于各个表的模式.此外,表及其模式仅在运行时已知(使用指定数据库路径的参数调用程序).
这是我到目前为止:
val conf = new SparkConf().setAppName("MyApp")
val sc = new SparkContext(conf)
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
// somehow bind sqlContext to DB
val allTables = sqlContext.tableNames
for( t <- allTables) {
val df = sqlContext.table(t)
val schema = df.columns
sqlContext.sql("SELECT * FROM " + t + "...").map(x => myFunc(x,schema))
}
Run Code Online (Sandbox Code Playgroud)
到目前为止我发现的唯一提示需要提前知道该表,在我的场景中并非如此:
val tableData =
sqlContext.read.format("jdbc")
.options(Map("url" -> "jdbc:sqlite:/path/to/file.db", "dbtable" -> t))
.load()
Run Code Online (Sandbox Code Playgroud)
我正在使用xerial sqlite jdbc驱动程序.那么我怎样才能仅仅与数据库联系,而不是对表?
编辑:使用Beryllium的答案作为开始我将我的代码更新为:
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val metaData = sqlContext.read.format("jdbc")
.options(Map("url" -> "jdbc:sqlite:/path/to/file.db",
"dbtable" …Run Code Online (Sandbox Code Playgroud) #include <pthread.h>
#include <unistd.h>
static void *tfunc(void *data)
{
return NULL;
}
int main(int argc, char **argv)
{
pthread_t t;
pthread_create(&t, NULL, tfunc, NULL);
sleep(1);
pthread_detach(t);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
参见MWE.它工作正常,但我不确定这是否是实际定义的行为.手册中pthread_detach没有提及在退出的线程上调用它.
是的我知道创建具有分离属性的线程,但我对这种情况特别好奇.pthread_join对这个案子有提及,我认为pthread_detach工作同样好,但我没有找到任何官方声明.
我有一个从文件中读取行的代码段,我想过滤掉某些行。基本上,我想过滤掉不具有三个制表符分隔列的所有内容,其中第一列是数字,其他两列可以包含除制表符和换行符之外的每个字符(Dos 和 Unix)。
我已经在http://www.regexr.com/上检查了我的正则表达式,它可以正常工作。
scala> val mystr = """123456\thttp://some.url/path/to/resource\t\x03U\x1D\x1F\x04D0B0@\xA0>\xA0<\x86:http://some.url/path/to/resource\x06\x08+\x06\x01\x05\x05\x07\x01\x01\x04C0A0?\n"""
scala> val myreg = "^[0-9]+(\t[^\t\r\n]+){2}(\n|\r\n)$"
scala> mystr.matches(myreg)
res2: Boolean = false
Run Code Online (Sandbox Code Playgroud)
我发现问题与特殊字符有关。举个简单的例子:
scala> val tabstr = """123456\t123456"""
scala> val tabreg = "^[0-9]+\t[0-9]+$"
scala> tabstr.matches(tabreg)
res3: Boolean = false
scala> val tabstr = "123456\t123456"
scala> val tabreg = "^[0-9]+\t[0-9]+$"
scala> tabstr.matches(tabreg)
res4: Boolean = true
Run Code Online (Sandbox Code Playgroud)
看来我不能在我的行中使用原始字符串(请参阅第一个代码块中的 mystr )。但是如果我不使用原始字符串 scala 会抱怨
error: invalid escape character
Run Code Online (Sandbox Code Playgroud)
那么我该如何处理这个混乱的输入并仍然使用我的正则表达式来过滤掉一些行呢?
最近在用WIC解析GIF。代码写好了,在win10和win7上都可以完美运行,但是在WinXP上就失败了。排除了半天,终于在这行代码上找到原因:
// pBitmapFrameDecode is an IWICBitmapFrameDecode
hr = pBitmapFrameDecode->GetMetadataQueryReader(&pFrameMetadataQueryReader);
if (hr == WINCODEC_ERR_UNSUPPORTEDOPERATION) MessageBoxA(NULL, "WINCODEC_ERR_UNSUPPORTEDOPERATION", "Error!", MB_OK);
Run Code Online (Sandbox Code Playgroud)
在这行代码中,GetMetadataQueryReader失败了,它会导致GetMetadataByName以下代码中的失败。觉得很奇怪,就查了MSDN。
IWICBitmapFrameDecode::GetMetadataQueryReader
但是我发现我的 XP 电脑符合 MSDN 编写的最低配置要求(SP3)。更奇怪的是,该函数返回WINCODEC_ERR_UNSUPPORTEDOPERATION. 这太奇怪了。一开始,我以为是我自己的设备问题,所以我借了几台XP电脑,在上面运行我的代码。他们都回来了WINCODEC_ERR_UNSUPPORTEDOPERATION。MSDN有错吗?
c++ ×5
c ×2
regex ×2
scala ×2
apache-spark ×1
c++-modules ×1
c++20 ×1
grammar ×1
inheritance ×1
lark-parser ×1
pthreads ×1
python ×1
sqlite ×1
templates ×1
wic ×1
winapi ×1
windows ×1