小编lll*_*lll的帖子

在远程ssh命令中传递变量

我希望能够使用ssh从我的机器运行命令并传递环境变量 $BUILD_NUMBER

这是我正在尝试的:

ssh pvt@192.168.1.133 '~/tools/myScript.pl $BUILD_NUMBER'
Run Code Online (Sandbox Code Playgroud)

$BUILD_NUMBER 在进行ssh调用的机器上设置,因为远程主机上不存在该变量,所以它不会被拾取.

我如何传递值$BUILD_NUMBER

linux ssh bash shell

84
推荐指数
3
解决办法
10万
查看次数

glEnableVertexAttribArray究竟做了什么?

我一直在阅读:

http://alfonse.bitbucket.io/oldtut/Basics/Tut01%20Dissecting%20Display.html

我不太清楚这个功能是做什么的.
认为它可以使用给定的VBO,但我不确定.

我以为那就是做了什么glEnableClientState(GL_VERTEX_ARRAY).

opengl

45
推荐指数
3
解决办法
3万
查看次数

Haskell:为什么用户定义的枚举算术序列需要额外的空间?

因此,对于Haskell中的任何内置类型,我可以构造一个算术序列,就像这个(for IntInteger等)

[1..5]
Run Code Online (Sandbox Code Playgroud)

但是如果我定义一个枚举类型:

data Suit = Club | Diamond | Heart | Spade deriving (Show, Enum) 
Run Code Online (Sandbox Code Playgroud)

当我创建一个算术序列时,我必须在枚举实例和点点之前包含空格,例如

[Club .. Diamond]
Run Code Online (Sandbox Code Playgroud)

为什么?

haskell user-defined-types

19
推荐指数
1
解决办法
350
查看次数

可变参数模板模板参数可以是部分专用的吗?

考虑以下程序:

template<template<typename ...> class>
struct foo {};

template<template<typename> class C>
struct foo<C> {};

int main() {}
Run Code Online (Sandbox Code Playgroud)

Clang拒绝了它的错误:

类模板部分特化不会专门化任何模板参数

即使在最新的clang 7.0 HEAD中,请参见此处的演示.但是,gcc接受了它.

请参阅[temp.class.spec],其中陈述了部分特化的规则,我找不到任何禁止该模板的部分特化的东西.特别是,专业化确实更专业,错误消息看起来不正确.

编辑:

但是,gcc的行为也是异常的,请考虑以下程序:

#include <iostream>

template<template<typename ...> class>
struct foo { void show() { std::cout << "Primary.\n"; } };

template<template<typename> class C>
struct foo<C> { void show() { std::cout << "Specialized.\n"; } };

template<class...> struct bar {};

int main() {
    foo<bar> f;
    f.show();
}
Run Code Online (Sandbox Code Playgroud)

事实证明,gcc在这种情况下使用专用版本,请参见此处.

现在我想问:

  • 是标准允许的这种局部专业化吗?

  • 哪个编译器是正确的?(一个/全部/没有?)

c++ templates clang template-specialization language-lawyer

17
推荐指数
1
解决办法
575
查看次数

为什么在C++中不允许调用main()

C++03 3.6.1.3:函数main不得在程序中使用(3.2)....

我想知道为什么这个规则存在...是否有人知道任何系统/实现,如果使用main,它将是一个问题?

PS 1.我知道该术语的定义used.2.我知道有一些简单的解决方法,比如从main()调用单个MyMain()并使用MyMain()代替.3.问题是关于现实世界的实施,如果不存在限制则会产生问题.谢谢!

c++ program-entry-point

16
推荐指数
3
解决办法
803
查看次数

Typesafe可变参数函数

我想编写一个接受可变数量的字符串文字的函数.如果我用C语写作,我必须写一些类似于:

void foo(const char *first, ...);
Run Code Online (Sandbox Code Playgroud)

然后调用看起来像:

foo( "hello", "world", (const char*)NULL );
Run Code Online (Sandbox Code Playgroud)

感觉它应该可以在C++中做得更好.我想出的最好的是:

template <typename... Args>
void foo(const char* first, Args... args) {
    foo(first);
    foo(args);
}

void foo(const char* first) { /* Do actual work */ }
Run Code Online (Sandbox Code Playgroud)

被称为:

foo("hello", "world");
Run Code Online (Sandbox Code Playgroud)

但是我担心递归本质,以及我们在得到单个参数之前不进行任何类型检查的事实,如果有人调用,会使错误混乱foo("bad", "argument", "next", 42).我想要写的,是这样的:

void foo(const char* args...) {
    for (const char* arg : args) {
        // Real work
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么建议?

编辑:还有选项void fn(std::initializer_list<const char *> args),但这使得foo({"hello", "world"});我想避免的呼叫.

c++ templates variadic-templates c++11 c++17

16
推荐指数
3
解决办法
1172
查看次数

显式检查boost :: log过滤器?

我有一些琐碎的日志记录:

BOOST_LOG_TRIVIAL(trace) << make_trace_record();
Run Code Online (Sandbox Code Playgroud)

现在make_trace_record是一个有点贵的功能(不要问为什么,这很复杂).我只想在日志当前通过过滤时调用它.我怎样才能做到这一点?我没有看到明确调用严重性过滤器的方法.

c++ boost boost-log c++11

10
推荐指数
1
解决办法
222
查看次数

static_cast'd指针值

在当前的标准草案(和C++ 17)中,是关于static_casting的void *:

类型"指针的prvalue CV1空隙"可以被转换成类型的prvalue"指针CV2 T",其中T是一个对象类型和CV2是相同的CV-资格,或更大的CV-资格比,CV1.如果原始指针值表示存储器中字节的地址A而A不满足T的对齐要求,则未指定结果指针值.否则,如果原始指针值指向对象a,并且存在类型为T(忽略cv-qualification)的对象b,该对象b是指针可互换,则结果是指向b的指针.否则,转换指针值不变.

我想知道,转换是指针可互换的有什么区别?有没有一种情况,当一个void *东西指向一个指针 - 可互换实际上改变指针值?这种区别的意图是什么?

对于完整性指针可互换:

如果出现以下情况,则两个对象a和b是指针可互换的:

  • (4.1)它们是同一个对象,或者
  • (4.2)一个是union对象,另一个是该对象的非静态数据成员([class.union]),或者
  • (4.3)一个是标准布局类对象,另一个是该对象的第一个非静态数据成员,或者,如果该对象没有非静态数据成员,则该对象的任何基类子对象([class. mem]),或
  • (4.4)存在对象c,使得a和c是指针可互换的,并且c和b是指针可互换的.

如果两个对象是指针可互换的,则它们具有相同的地址,并且可以通过reinterpret_cast从指向另一个的指针获得指向一个对象的指针.

c++ void-pointers static-cast language-lawyer c++17

9
推荐指数
1
解决办法
456
查看次数

为什么模板只有有效的空可变参数包形成?

什么是理由

temp.res#8.3

(8)可以在任何实例化之前检查模板的有效性.[注意:知道哪些名称是类型名称允许以这种方式检查每个模板的语法.- 结束注释]程序格式错误,无需诊断,如果:
[..]
(8.3)可变参数模板的每个有效特化都需要一个空的模板参数包,或者

该规则不允许使用如下强制模板扣除的技巧:

template <typename ...Ts,
          typename A,
          typename B,
          std::enable_if_t<sizeof...(Ts) == 0, int> = 0> // Ill-formed NDR :-(
Pair<std::decay_t<A>, std::decay_t<B>> MakePair(A&&a, B&& b)
{
    return {a, b};
}
Run Code Online (Sandbox Code Playgroud)

注意:我知道C++ 17演绎规则make_*已经过时了.

c++ templates language-lawyer variadic-templates

9
推荐指数
1
解决办法
139
查看次数

使用const键擦除set中的元素

无序的设置键是只读的,所以为什么在这种情况下我可以擦除元素:

std::unordered_set<std::string> s;
s.emplace("sth");
s.erase("sth");
Run Code Online (Sandbox Code Playgroud)

而在这不是:

std::unordered_set<std::string const> s;
const std::string str("sth");
s.emplace(str);
s.erase(str);
Run Code Online (Sandbox Code Playgroud)

如果设置本身就是const它会有意义但是使用const键我不太明白.这个断言失败了:

static_assert(!is_reference<_Tp>::value && !is_const<_Tp>::value, "");
Run Code Online (Sandbox Code Playgroud)

为什么会写那个断言的人,检查密钥是不是const?

编辑:

实际上,上面的代码编译得很好std::set.因为std::unordered_set,失败直接在实例化.重现的最小例子:

// define a customized hash ... 
int main() { sizeof(std::unordered_set<int const>); }
Run Code Online (Sandbox Code Playgroud)

c++ stl language-lawyer

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