我想编写一个通用的构建器类,它包含任何 java 类并提供特定样式的 setter 函数。我不确定这是否可以称为“动态生成的函数”。
当我有一个豆豆 Pojo 类时,即
class Pojo {
public void setValue(int value) {...}
public void setName(String name) {...}
}
Run Code Online (Sandbox Code Playgroud)
我的Maker班级应该可以这样使用:
Pojo p = Builder<Pojo>.create(new Pojo())
.setName("Funny")
.setValue(123)
.build();
Run Code Online (Sandbox Code Playgroud)
如您所见,它所做的工作应该类似于
class PojoBuilder {
private Pojo pojo;
PojoBuilder(Pojo pojo) { this.pojo = pojo; }
public static PojoMaker create(Pojo p) { return new PojoBuilder(p); }
public PojoBuilder setName(String name) { pojo.setName(name); return this; }
public PojoBuilder setValue(int val) { pojo.setValue(val); return this; }
public Pojo make() …Run Code Online (Sandbox Code Playgroud) 我认为的调用operator<<会生成一个两参数的函数调用。那么,为什么不编译呢?
#include <iostream> // ostream
#include <iomanip> // setw, setfill
using std::ostream; using std::setw; using std::setfill;
struct Clock {
int h_, m_, s_;
Clock(int hours, int minutes, int seconds)
: h_{hours}, m_{minutes}, s_{seconds} {}
void setClock(int hours, int minutes, int seconds) {
h_ = hours; m_ = minutes; s_ = seconds;
}
friend ostream& operator<<(ostream&os, const Clock& c) {
auto w2 = [](ostream&os, int f) -> ostream& {
return os << setw(2) << setfill( '0' ) << f; …Run Code Online (Sandbox Code Playgroud) 我想用 jq创建 JSON 输出,如下所示:
{
"records": [
{
"id": "1234",
"song": "Yesterday",
"artist": "The Beatles"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我认为我必须摆弄 jq 的“过滤器”,在阅读文档后我没有完全理解它的概念。
这是我到目前为止得到的:
$ jq --arg id 1234 \
--arg song Yesterday \
--arg artist "The Beatles" \
'.' \
<<<'{ "records" : [{ "id":"$id", "song":"$song", "artist":"$artist" }] }'
Run Code Online (Sandbox Code Playgroud)
哪个打印
{
"records": [
{
"id" : "$id",
"song" : "$song",
"artist" : "$artist"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我要修改过滤器吗?我要更改输入吗?
我刚注意到,在N3291中标记了一个更改(5.2.1 Subscripting [expr.sub]):
之前,可以operator[]使用新的braced-init-list重载:
struct X {
Z operator[](std::initializer_list<int>);
};
X x;
x[{1,2,3}] = 7; // OK: meaning x.operator[]({1,2,3})
Run Code Online (Sandbox Code Playgroud)
现在删除并替换为:
braced-init-list不能与内置的下标运算符一起使用.
出了什么问题?
在N2812中是引言中的一个例子,其中a unique_ptr作为值参数给出
void push_back2(
std::list<std::unique_ptr<int>>& l, std::unique_ptr<int> a)
{
l.push_back(a); // oops: moves from the lvalue 'a', silently!
l.push_back(a); // oops: 'a' no longer has its original value
}
Run Code Online (Sandbox Code Playgroud)
本文讨论了RValue/LValue重载分辨率的问题,但这不是我的观点.
我想知道,如果提供参数std::unique_ptr<int> a by-value不会导致编译器错误?它会复制它,对吗?这是不允许的unique_ptr
我知道这篇论文很老了,也许这个定义unique_ptr已经改变了.但也许这只是一个错字,而作者想要写作std::unique_ptr<int> &a呢?
我的gcc 4.7.0与我同意,但那没有证据:-)
void push_back2( std::list<std::unique_ptr<int>>&, std::unique_ptr<int> ) { };
int main() {
list<unique_ptr<int>> lst;
unique_ptr<int> num { new int{4} };
push_back2(lst, num); //ERR: use of deleted function
}
Run Code Online (Sandbox Code Playgroud) 我必须重构并维护一堆看起来很糟糕的Java类.许多人具有以下实施模式
class Machine {
public int advance(int state) {
switch(state) {
case 7: return step_7();
case 13: return step_13();
case 4: return step_4();
}
}
private int step_7() {
if(something) return 13; else return 4;
}
private int step_13() {
...
return 4;
}
private int step_4() {
if(miep) return 7;
...
return 13;
}
}
Run Code Online (Sandbox Code Playgroud)
从这里我想生成一个图形(与Graphviz和dot) - 一种"静态调用图",但不完全.
我在这里游戏如何自动执行此操作,除了使用Perl或Python自己解析Java代码.
我真正喜欢的是有一个抽象语法树(AST)或类似我可以浏览的类,同时打印dot-code.
gprof想到这里).在看到 Herb Sutters关于“原子武器”的精彩演讲后,我对放松原子的例子感到有些困惑。
我认为C++ 内存模型(SC-DRF = Sequentially Consistent for Data Race Free)中的原子在加载/读取时执行“获取”。
我知道对于负载 [和存储] 是默认值std::memory_order_seq_cst,因此两者是相同的:
myatomic.load(); // (1)
myatomic.load(std::memory_order_seq_cst); // (2)
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都很好,没有涉及放松的原子(在听完演讲后,我永远不会使用放松的原子。永远。承诺。但当有人问我时,我可能不得不解释......)。
但是为什么我使用时它是“宽松”的语义
myatomic.load(std::memory_order_acquire); // (3)
Run Code Online (Sandbox Code Playgroud)
既然负载是获取而不是释放,为什么这与(1)和不同(2)?究竟是在这里放松?
我唯一能想到的就是我误解了load意味着acquire。如果这是真的,并且默认值seq_cst意味着两者,那不就意味着一个完整的围栏 - 没有任何东西可以传递该指令,也不能传递?我一定误解了那部分。
[并且对称地用于存储和释放]。
我可以定义一个不改变类型而仅针对单个类型的可变参数模板函数吗?如果我的目标是定义一个仅添加可变数字 的函数int,但不添加 float 或其他任何内容,我可以用template<int....>某种语法来做到这一点吗?
我可以轻松组合的多类型示例:
int add() { return 0; }
template<typename T, typename... TS>
T add(T n, TS... m)
{ return n+add(m...); }
Run Code Online (Sandbox Code Playgroud)
但我该如何int只用在这个呢?它显然不能遵循放入<int>模板参数列表的模式,因为我想要一个在 之间接受参数的函数(...),而不是在之间接受参数<...>,如下所示:
template<int n>
int constant() { return n; }
constant<4>(); // using the int-template function
Run Code Online (Sandbox Code Playgroud)
因此,对我来说很明显,以下内容是行不通的。但作为一个起点...
template<int, int...>
int add(int n, int... m) // error, of course.
{ return n+add(m...); }
Run Code Online (Sandbox Code Playgroud)
我如何定义addfor add(1)、add(1,2)等add(1,2,3) ,但仅限于int …
是什么阻止了这个初始化工作?
#include <map>
using std::map; using std::pair; using std::make_pair;
struct P {
char a_, b_;
P(char a, char b) : a_{a}, b_{b} {}
operator pair<char,char>() { return make_pair(a_, b_); }
};
int main() {
map<char,char> qmap { P( 'a','b' ) };
}
Run Code Online (Sandbox Code Playgroud)
看起来转换运算符 inP不能隐式应用在花括号初始化列表中?或者是别的什么?
我找到了几个使用新的Initializer语法的例子{...}.但这些例子已经很老了.我只是想交叉检查 - 目前的情况仍然如描述的那样?
在每个上下文(特别是模板)中,以下源片段始终是非模糊的 - 无论是什么T和v不是.
T{v};- 始终构造临时类型T并使用值初始化它v.T x{v};- 初始化带有值x的类型变量.TvT x = {v};- 同样,因为=这里只是可选的.T a[] = {v};- 使用值初始化数组的所有元素v.p = new T{v};- T在堆上分配类型的对象并使用值初始化它v.因此,它仍然是正确的,告诉人们"更喜欢{}-syntax,你的源代码不会有不同的含义,取决于什么T和v是什么".
c++ ×5
c++11 ×4
curly-braces ×2
java ×2
arrays ×1
bash ×1
call-graph ×1
dfa ×1
generics ×1
graphviz ×1
jq ×1
json ×1
lambda ×1
memory-model ×1
ostream ×1
outputstream ×1
profile ×1
stdatomic ×1
templates ×1
unique-ptr ×1
wrapper ×1