小编fra*_*ans的帖子

是否存在独立于编程语言的任意集合的通用查询语言?

我正在寻找一种独立于编程语言或集合类型来定义集合查询的方法。

详细来说,这将是 Java、C++、Python 等常见语言的语言定义和实现。

正如所评论的,我不是在寻找数据库或集合表示的任何实现,而只是寻找一种定义元素查询的方法,例如Pythonstd::set/vectorset()任何可以视为集合的线性结构。

一个类似的例子是jLinq之类的东西,但不依赖于 JSON 或 javascript,并且具有明确定义的字符串表示形式。

当然,如果不知道数据结构的类型,您就必须为每个问题和每种编程语言实现任何条件过滤器,但是构造查询字符串的方式以及如何评估它们将会很清楚,并且您不必编写解析器。

所以我想用 Java 或 C++ 编写类似于

q = query()
.created_after("14.03.2010")
.and(contains("hello")
     .or(contains("hallo")))
.sort("caption")
Run Code Online (Sandbox Code Playgroud)

或写为字符串:

"(created_after("14.03.2010") and ( contains("hello") or contains("hallo"))) sort("caption")"
Run Code Online (Sandbox Code Playgroud)

(这没有经过深思熟虑 - 只是为了展示界面的外观)

JSON 或 XML 是解决不同问题的一个很好的例子:清晰的语言定义和适用于任何平台或编程语言的解析器/工具。

cross-platform cross-language set

6
推荐指数
1
解决办法
1283
查看次数

没有Boost的现代C++中的bimap实现

我承认这个问题在之前已经被问到,但是现在是4年前,我敢于要求更新:

我需要一种方法来将一个元组/对添加到容器中并有效地搜索左侧和右侧元素.

升压具有bimapmulti_index该做的正是我想要的,但我不知道什么是纯现代C++推荐的替代方案- 11/14如果你不希望引入的依赖性提高(无论何种原因).

链接中的一个答案表明不需要s.th. 由于透明的比较器,更像是一个bimap .接受的答案表明将std::maps与key1- > key2key2- > 组合在一起的实现key1.

我真的不知道透明比较器如何帮助我,我只是好奇是否有一些这是你应该怎么做以及为什么 - 解决方案.你能提供一些提示/链接吗?

c++ boost bimap c++11 c++14

6
推荐指数
1
解决办法
1955
查看次数

在某些情况下,CMake 找不到 Boost 的可能原因?

我使用CMake (3.4.1)根据Boost库构建了一个 C++ 项目。宿主平台为Linux,目标为宿主和交叉构建的Android NDK。

我只使用 Boost 头文件,我刚刚下载/提取了 boost 文件夹(我没有/usr/include/boost目录)。

在我的CMakeLists.txt文件中,我像这样声明了对 Boost 的依赖:

find_package(Boost 1.57 REQUIRED)
Run Code Online (Sandbox Code Playgroud)

我像这样配置我的构建:

BOOST_ROOT=/path/to/boost cmake ../src
Run Code Online (Sandbox Code Playgroud)

这实际上工程预期为我的本地版本。

当我现在以完全相同的方式配置构建时(仅指定更多环境变量和 CMAKE_TOOLCHAIN_FILE)CMake 给了我:

BOOST_ROOT=/path/to/boost JAVA_HOME=/bla/bla/bla \
ANDROID_NDK=/bla/bla/bla \
ANDROID_SDK=/bla/bla/bla \
ANT=/usr/bin/ant \
cmake ../src -DCMAKE_TOOLCHAIN_FILE=/bla/bla/android.toolchain.cmake

CMake Error at /usr/share/cmake/Modules/FindBoost.cmake:1247 (message):
  Unable to find the requested Boost libraries.

  Unable to find the Boost header files.  Please set BOOST_ROOT to the root
  directory containing Boost or …
Run Code Online (Sandbox Code Playgroud)

c++ linux boost cross-platform cmake

6
推荐指数
1
解决办法
816
查看次数

强制处理类中的所有成员变量

是否有一个概念可以确保向现有类添加成员会产生某种错误/警告,以防实现者忘记扩展应处理所有成员的方法?

如果一个类实现了多个必须触及所有元素的方法(例如导入/导出),则很容易忘记一个或多个要适应的方法。编译器不会识别它,并且在很多情况下其行为将符合预期(当然,除非您有正确的测试。)

我当前的尝试是在每个可能被默默遗忘的方法中测试类的大小。但当然,这不容易阅读,不安全,并且不独立于编译器/平台/构建类型(所以我不喜欢它)。

class C
{ 
    int element1;
    int element2;
    int element3;   <--- newly added without adapting operator==()

public:

    void import_me();
    void export_me();
    bool operator== (const C&);
    void dump();
};
Run Code Online (Sandbox Code Playgroud)

该实现可能隐藏在不同/大文件中:

void C::import_me(){
    assert( sizeof( *this ) == 12 ); // this is my attempt of doing this

    read_fn( element1 );
    read_fn( element2 );
    read_fn( element3 );
}

void C::export_me(){
    assert( sizeof( *this ) == 12 ); // this is my attempt of doing this

    write_fn( element1 );
    write_fn( element2 …
Run Code Online (Sandbox Code Playgroud)

c++ class member handle

5
推荐指数
1
解决办法
136
查看次数

提供格式化字符串作为参数的现代方法

我有一个与std::string 格式非常相似的问题,例如 sprintf这个问题,但这些问题非常旧,所以我敢于重试以收集一些方法。

我想要一个函数/方法,它接受参数来定义带有一些变量的格式化字符串,很像printf/ sprintf。例如,它可以是一种send_string(ARGS)格式化字符串并将其发送到某个接收者的方法。例如:

server->send_message("value1: %d, value2: %0.3f, value3: %s", 2, 3.14, "hello world");
Run Code Online (Sandbox Code Playgroud)

我知道流的概念,我也知道boost::format。但我想知道没有不必要的依赖关系的最简单的方法是什么。

这是我的想法:

  • 使用基于流的方法- 结果将如下所示:

    server->msg_out() << "value1: " << 2 
                      << ", value2: " << 3.14 
                      << ", value3: '" << "hello world" << "'";
    
    Run Code Online (Sandbox Code Playgroud)

    这对我来说看起来最合理,但它非常冗长,很难看出输出会是什么样子。特别是当您尝试实现表格输出或实际值的特殊格式时。从好的方面来说,你没有任何依赖性。

  • 使用基于 C 的变量参数。看起来就像上面的例子,尽管它已被弃用、容易出错且不灵活,但它是众所周知的并且被大量使用。

  • 使用Boost.Format

    server->send_message(boost::format(
                "value1: %d, value2: %0.3f, value3: %s") % 2 % 3.14 % "hello world")); …
    Run Code Online (Sandbox Code Playgroud)

c++ string string-formatting

5
推荐指数
1
解决办法
1374
查看次数

git:在浅克隆上克隆特定提交 ID

我发现了很多关于克隆存储库并立即检查给定提交 ID 的问题/答案。简单的方法:

git clone <URL> working-copy
cd working-copy; git checkout <COMMIT-ID>
Run Code Online (Sandbox Code Playgroud)

通过分支机构,您可以git clone -b <BRANCH> <URL>

使用分支,您还可以进行浅克隆,这使得克隆速度更快,但您无法再检出任意 ID。

所以我的问题是:有没有一种方法可以对给定的 URL/提交 ID 进行浅表克隆,而无需在远程创建分支?

不同类型的远程存储库有区别吗?(例如本地文件系统、BitBucket、GitHub、GitLab 等)

git commit git-clone shallow-clone

5
推荐指数
1
解决办法
5369
查看次数

从 split() 获取最小数量的元素

想象一个包含(逗号)分隔元素的字符串,例如版本字符串

version_str = "3,1,4,159"
Run Code Online (Sandbox Code Playgroud)

其中可能或多或少包含一个或多个元素:

version_str = "3,1,4"
Run Code Online (Sandbox Code Playgroud)

或者

version_str = "3,1,4,159,appendix"
Run Code Online (Sandbox Code Playgroud)

我想像这样分开这些元素:

major, minor, patch, revision, appendix = version_str.split(',')
Run Code Online (Sandbox Code Playgroud)

然后我当然会得到一个ValueError,因为提取的元素数量并不总是匹配。

有没有办法得到extend结果split(),例如这样:

version_str.split(',', min_elements=5)
Run Code Online (Sandbox Code Playgroud)

或者

version_str.split(',').extend(5, default='')
Run Code Online (Sandbox Code Playgroud)

例子:

>>> '3,1,4'.split(',', min_elements=5)
['3', '1', '4', '', '']

>>> '3,1,4,159,dev'.split(',', min_elements=5)
['3', '1', '4', '159', 'dev']
Run Code Online (Sandbox Code Playgroud)

当然,我可以随后手动添加元素或有条件地读取元素,但我对 pythonic one-liner 感兴趣。

python string split

5
推荐指数
1
解决办法
849
查看次数

根据用户名转发 SSH 连接

我发现很多网站解释ssh 端口转发ssh 反向代理ssh 多路复用sshpiper等,涉及sslh运行 ssh 袜子服务器配置本地 SSH 服务器等等。所以我现在很困惑,可能会问一个非常常见和/或简单的问题:

正如您可能已经从标题中猜到的那样,我想在 docker 容器内设置一个 git 服务器 (GitLab),监听端口 22 上的 SSH 连接,而不必使用不同的端口进行默认 ssh 操作(终端、scp 等......)在主机上(按照此处的建议)

IE

  • ssh alice@myserver.org应该仍然是可能的以及
  • git clone git@myserver.com:path/to/project
  • 我不想在客户端计算机上进行任何设置

如果您喜欢图片:

                                      +------ myserver.org --------+
                                      |  +----+     +- typical -+  |
+--------+   alice@myserver.org:22    |  |    |     |   SSH     |  |
| client |  ---------------------->  -+--+----+---->|  service  |  |
+--------+     all names but `git`    |  | …
Run Code Online (Sandbox Code Playgroud)

ssh port proxy reverse-proxy docker

5
推荐指数
1
解决办法
1473
查看次数

建议使用可能抛出的表达式初始化const变量的方法

您可能知道这样的情况,您只想分配一个const带有表达式的()变量,该表达式可能会失败(抛出)(例如container.at()),这会迫使您编写样板代码:

void foo(const string &key) {
    auto it = data_store.find(key);
    if (it == data_store.end()) {
        return;
    }
    const auto & element = it->second;
    ...
    go on with `element`...
    ...
}
Run Code Online (Sandbox Code Playgroud)

在Python中,您可以编写如下代码:

def foo(name):
    try:
        element = data_store[key]
    except KeyError:
        return
    ..
    go on with `element`
    ..
Run Code Online (Sandbox Code Playgroud)

..因为你没有引入那些无用的额外it只是为了检查存在而没有噪音.

如果C++ try不会引入变量作用域,你可以使用at():

void foo(const string &key) {
    try {
        const auto & element = data_store.at(key);
    } catch (const out_of_range &) {
        return;
    }
    ... …
Run Code Online (Sandbox Code Playgroud)

c++ exception-handling const

5
推荐指数
1
解决办法
124
查看次数

在CMake中,我如何使`TARGET_LINK_LIBRARIES`禁止来自第三方库代码的警告?

在CMake中,您可以将TARGET_INCLUDE_DIRECTORIES()add include目录作为系统 include目录(即use -isystem),以免弹出根于第三方代码的警告:

TARGET_INCLUDE_DIRECTORIES(mytarget
    SYSTEM
        ${3rdPartyLib_INCLUDE_DIR})
Run Code Online (Sandbox Code Playgroud)

我更喜欢使用TARGET_LINK_LIBRARIES它,这也使来自第三方库的包含目录可用。据我所知,TARGET_LINK_LIBRARIES不支持将SYSTEM修饰符添加为系统包含目录的那些目录。

我做错了吗?

有没有办法使:

TARGET_LINK_LIBRARIES(mytarget
    ${3rdPartyLib_INCLUDE_DIR})
Run Code Online (Sandbox Code Playgroud)

使用-isystem?(或通过抑制警告的任何其他方式3rdPartyLib)。

c++ warnings cmake include suppress-warnings

5
推荐指数
2
解决办法
432
查看次数