Jon*_*rdy 4 c++ with-statement c++11
编辑:
所以这个问题被误解为这样一个荒谬的程度,它已经没有意义了.我不知道怎么回事,因为我实际问过的问题是我是否具体实现了这个 - 是的,已知是无意义的,是的,不是非常类似于惯用的C++ - 宏,它是否尽可能好,以及它是否必然不得不使用auto,或者如果有合适的解决方法.它不应该产生这么多的关注,当然不是对这种程度的误解.要求受访者编辑他们的答案是毫无意义的,我不希望任何人因此而失去声誉,并且在这里有一些好的信息可供潜在的未来观众使用,所以我将随意挑选一个较低的选民答案是均匀分配所涉及的声誉.继续前进,没有什么可看的.
我看到了这个问题,并认为with用C++ 编写语句可能很有趣.该auto关键字使这很容易,但有一个更好的方式来做到这一点,或许不使用auto?为简洁起见,我省略了一些代码.
template<class T>
struct with_helper {
with_helper(T& v) : value(v), alive(true) {}
T* operator->() { return &value; }
T& operator*() { return value; }
T& value;
bool alive;
};
template<class T> struct with_helper<const T> { ... };
template<class T> with_helper<T> make_with_helper(T& value) { ... }
template<class T> with_helper<const T> make_with_helper(const T& value) { ... }
#define with(value) \
for (auto o = make_with_helper(value); o.alive; o.alive = false)
Run Code Online (Sandbox Code Playgroud)
这是一个(更新的)用法示例,其中有一个更典型的案例,显示了with在其他语言中使用的情况.
int main(int argc, char** argv) {
Object object;
with (object) {
o->member = 0;
o->method(1);
o->method(2);
o->method(3);
}
with (object.get_property("foo").perform_task(1, 2, 3).result()) {
std::cout
<< (*o)[0] << '\n'
<< (*o)[1] << '\n'
<< (*o)[2] << '\n';
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我之所以选择o它是因为它是一个不常见的标识符,它的形式给人一种"通用的东西"的印象.如果你对一个更好的标识符或一个更实用的语法有了一个想法,那么请建议它.
如果你使用auto,为什么要使用宏呢?
int main()
{
std::vector<int> vector_with_uncommonly_long_identifier;
{
auto& o = vector_with_uncommonly_long_identifier;
o.push_back(1);
o.push_back(2);
o.push_back(3);
}
const std::vector<int> constant_duplicate_of_vector_with_uncommonly_long_identifier
(vector_with_uncommonly_long_identifier);
{
const auto& o = constant_duplicate_of_vector_with_uncommonly_long_identifier;
std::cout
<< o[0] << '\n'
<< o[1] << '\n'
<< o[2] << '\n';
}
{
auto o = constant_duplicate_of_vector_with_uncommonly_long_identifier.size();
std::cout << o <<'\n';
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:没有auto,只是使用typedef和引用.
int main()
{
typedef std::vector<int> Vec;
Vec vector_with_uncommonly_long_identifier;
{
Vec& o = vector_with_uncommonly_long_identifier;
o.push_back(1);
o.push_back(2);
o.push_back(3);
}
}
Run Code Online (Sandbox Code Playgroud)
?? 尝试将vb语法转换为C++
with在默认情况下引用我说过要做的对象,请执行以下块中的所有操作吗?执行一系列语句,重复引用单个对象或结构.
with(a)
.do
.domore
.doitall
Run Code Online (Sandbox Code Playgroud)
那么该示例如何为您提供相同的语法?
向我举例说明为什么要使用多个de引用的地方
所以而不是
book.sheet.table.col(a).row(2).setColour
book.sheet.table.col(a).row(2).setFont
book.sheet.table.col(a).row(2).setText
book.sheet.table.col(a).row(2).setBorder
Run Code Online (Sandbox Code Playgroud)
你有
with( book.sheet.table.col(a).row(2) )
.setColour
.setFont
.setText
.setBorder
Run Code Online (Sandbox Code Playgroud)
看起来就像在C++中一样简单,也是更常见的语法
cell& c = book.sheet.table.col(a).row(2);
c.setColour
c.setFont
c.setText
c.setBorder
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
459 次 |
| 最近记录: |