小编Art*_*yer的帖子

允许带有nargs的位置命令行参数由标志分隔

我有一个使用argparse的程序.它需要1个必需的位置参数,1个可选的位置参数和1个标志参数.

就像是:

usage: test.py [-h] [-a A] b [c]
Run Code Online (Sandbox Code Playgroud)

所以,我试过用这个:

parser = argparse.ArgumentParser()

parser.add_argument('-a')
parser.add_argument('b')
parser.add_argument('c', nargs='?', default=None)
print(parser.parse_args())
Run Code Online (Sandbox Code Playgroud)

哪个适合test.py B C -a Atest.py -a A B C.

但是当我这样做时test.py B -a A C,它会抛出一个错误:

$ python3 test.py B -a A C
usage: test.py [-h] [-a A] b [c]
test.py: error: unrecognized arguments: C
Run Code Online (Sandbox Code Playgroud)

那么,即使两者之间有标志,我如何才能接受可选的位置参数?

请注意,如果我删除nargs='?', default=None它,这是有效的,但它不是可选的.这个问题也有发生nargs='*',但这种情况不会发生的nargs=N(例如nargs=1,nargs=2),并不会发生了nargs='+'.nargs=argparse.REMAINDER使它解析标志作为c(c = ['-a', …

python command-line-arguments argparse

7
推荐指数
1
解决办法
340
查看次数

如何使用带有-std = c ++ 17的g ++ 6.2.0包含C++ 17头文件(可选,任何,string_view,variant)

std::optional在C++ 17中,它在std::experimental::optional以前.

我尝试<optional>使用以下命令编译包含的文件:

g++ -std=c++17 <filename>.cpp
Run Code Online (Sandbox Code Playgroud)

(在Bash终端).我收到以下错误:

<filename>.cpp:5:20 fatal error: optional: No such file or directory
 #include <optional>
                    ^
compilation terminated
Run Code Online (Sandbox Code Playgroud)

但我可以#include <experimental/optional>.

我错过了一些头文件吗?我怎样才能包含optional标题?

我也不能包括<any>,<string_view>或者<variant>,得到相同的错误.

c++ g++ include header-files c++17

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

ANSI C函数声明中的隐式int返回类型的规则

我知道f(void) { return 0; }返回类型为int,即使未指定,但以下情况如何:

(*f())[]{}

(*g())(){}

const*h(){}
Run Code Online (Sandbox Code Playgroud)

编译时在gcc上没有错误-ansi -Werror -pedantic,仅抱怨clang中缺少return语句:https : //godbolt.org/z/jAYL4v

f似乎具有的返回类型int(*)[]g似乎具有的返回类型int(*)(),并且h似乎具有的返回类型const int*

在ANSI C标准中,我似乎找不到规则。我检查了[6.5.4.3函数声明符(包括原型)]和[6.7.1函数定义],但是甚至在隐式int返回类型上都找不到任何东西(某些示例代码除外)。我在找错地方了吗?这是有效的代码吗?

c c89 language-lawyer

5
推荐指数
0
解决办法
103
查看次数

如何考虑非类型模板参数类型的 ADL

我想在函数调用中查找期间考虑非类型模板参数的命名空间中的函数。

例如:

template<auto& N>
struct test_nontype {
    int call() {
        return f(*this);  // error: 'f' was not declared in this scope
    }
};

template<typename T>
struct test_type {
    int call() {
        return f(*this);  // ok, f is found in ns via ADL
    }
};


namespace ns {
    static struct type_in_ns {} value;
    int f(test_nontype<value>) {
        return 3;
    }
    int f(test_type<type_in_ns&>) {
        return -3;
    }
}

int main() {
    int x = test_type<ns::type_in_ns&>{}.call();
    return x + test_nontype<ns::value>{}.call();
}
Run Code Online (Sandbox Code Playgroud)

对于类型,它工作正常,但最后一行无法编译,因为int ns::f(test_nontype<ns::value>) …

c++ argument-dependent-lookup

5
推荐指数
0
解决办法
60
查看次数

多参数构造函数比单元组参数构造函数有用吗?

例如,是否曾经有过 like 类型type x = A of int * int优于type y = B of (int * int)? 这种区别实际上意味着什么?


我看到x更糟糕的地方是试图将构造函数的“参数”(似乎是两个参数,但它打印为一个元组)作为一个元组:

type x = A of int * int
type y = B of (int * int)
              
let v = (1, 1)
(* let a = A v  (* Doesn't work *) *)
let b = B v  (* Works *)

(* let f = function
| A v -> v  (* Doesn't work *) *) …
Run Code Online (Sandbox Code Playgroud)

ocaml

3
推荐指数
1
解决办法
53
查看次数

将char转换为1个字符的以null结尾的字符串

说我char喜欢:

char a = 'a';
Run Code Online (Sandbox Code Playgroud)

我怎样才能将它转换成这样的东西:

char* b = "a";
// b = {'a', '\0'};
Run Code Online (Sandbox Code Playgroud)

(技术上2 char秒,因为它应该为空终止)

我的用例是三元表达式,我想将其转换'\0'"\\0"({ '\\', '0', \0' }),但其他每个字符都是一个字母,我想保持不变.

letter == '\0' ? "\0" : letter;
Run Code Online (Sandbox Code Playgroud)

这有效,但会产生关于不匹配类型的错误.我还有其他可能需要使用的东西.

我尝试过的事情:

letter == '\0' ? "\\0" : letter;
// error: pointer/integer type mismatch in conditional expression [-Werror]

letter == '\0' ? "\\0" : { letter, '\0' };
//                       ^
// error: expected expression before ‘{’ token

letter == '\0' ? "\\0" …
Run Code Online (Sandbox Code Playgroud)

c arrays string pointers char

0
推荐指数
1
解决办法
221
查看次数