而不是使用
std::vector<Object> ObjectArray;
Run Code Online (Sandbox Code Playgroud)
我希望它是
MyArray<Object> ObjectArray;
Run Code Online (Sandbox Code Playgroud)
保留所有std :: vector方法.(比如push_back(),reserve(),...等)
但是,使用
typedef std::vector MyArray;
Run Code Online (Sandbox Code Playgroud)
不行.我应该使用模板吗?怎么样?
在更新一些代码以使用统一初始化时,我认为它将成为现在"旧式"括号样式的现代替代品.我知道情况并非总是如此(显而易见的例子vector<int>),但我偶然发现了另一个我不理解的差异.
class Object {
public:
Object() = default;
Object(const Object&) = default;
};
int main() {
Object o;
Object copy{o}; // error
Object copy2(o); // OK
}
Run Code Online (Sandbox Code Playgroud)
无法在clang3.5下编译并出现错误:(在gcc下也失败)
error: excess elements in struct initializer
Run Code Online (Sandbox Code Playgroud)
这有两个不同的变化Object使这项工作.向其添加数据成员,或为其提供空复制构造函数体
class Object {
private:
int i; // this fixes it
public:
Object() = default;
Object(const Object&) { } // and/or this fixes it as well
};
Run Code Online (Sandbox Code Playgroud)
我不明白为什么这些应该有所作为.
当decltype在命名空间周围使用时,我可以编写编译的代码,但该语句在g ++ 4.9.1下似乎没有任何影响,在它生成的clang下error: unexpected namespace name 'std': expected expression
例如,以下所有都在g ++下编译,但程序集不显示为它们生成的任何代码.
using s = decltype(std);
auto n = typeid(decltype(std)).name();
auto sz = n.size();
std::printf("size is %zu\n", sz+1);
std::printf("this type is: %s\n\n", n.c_str());
// the only limit is your imagination
int f();
std::ostream trash = f(typeid(decltype(std)) * 10 - 6 ^ typeid(decltype(std)));
Run Code Online (Sandbox Code Playgroud)
如果g ++允许这样做是对的吗?如果是这样,代码的优势是什么消失而不是导致编译时错误?
我没有看到任何合乎逻辑的理由.我的意思是你可以通过使用包含这样的数组成员的结构轻松克服这个要求:
template <size_t n>
struct arr { int d[n]; };
auto fnReturningArray()
{
return arr<3>{0, 1, 2};
};
Run Code Online (Sandbox Code Playgroud)
其行为方式与直接返回数组的方式完全相同,只是您应首先访问结构成员'd'以使用它.标准本身也通过'std :: array'类型添加了类似的功能.所以它似乎可以实现.为什么ISO C++禁止这个动作?也许遗留代码兼容性(但我很难相信这是因为添加的其他新东西已经很久了,例如'auto'关键字的新含义).
我有一个带有constexpr值构造函数的类,但没有复制或移动ctor
class C {
public:
constexpr C(int) { }
C(const C&) = delete;
C& operator=(const C&) = delete;
};
int main() {
constexpr C arr[] = {1, 2};
}
Run Code Online (Sandbox Code Playgroud)
我发现这段代码不起作用,因为它实际上是试图使用移动构造函数C而不是值构造函数来构造.一个问题是我希望这个对象不可移动(出于测试目的),但我认为"好吧,好吧,我会添加一个移动构造函数."
class C {
public:
constexpr C(int) { }
C(const C&) = delete;
C& operator=(const C&) = delete;
C& operator=(C&&) = delete;
C(C&&) { /*something*/ } // added, assume this must be non trivial
};
Run Code Online (Sandbox Code Playgroud)
好的,现在它使用移动构造函数,一切都在gcc下运行但是当我使用clang时,它会抱怨因为移动构造函数没有标记constexpr
error: constexpr variable 'arr' must be initialized by …Run Code Online (Sandbox Code Playgroud) 我知道标准有一个例外,关于延长temporaries的生命周期,基本上说在构造函数中绑定const引用不会延长生命周期,但这是否也适用于文字?例如:
class C {
private:
const int& ref;
public:
C(const int& in)
: ref{in}
{ }
};
Run Code Online (Sandbox Code Playgroud)
如果我有一个函数返回这种类型的对象
C f() {
C c(2);
return c;
}
Run Code Online (Sandbox Code Playgroud)
c.ref如果我知道它与文字绑定,那么调用者的值是否未定义?
对不起,如果有人在其他地方询问,但我无法弄清楚这一点.我有一个论坛,其中包含部分,主题和回复.我正在尝试编辑和删除show topic视图中的回复.这是结构:
resources :sections do
resources :topics do
resources :replies
end
end
Run Code Online (Sandbox Code Playgroud)
所以我做了一个rake路线,看看我在哪里链接我的编辑回复.我看到它的edit_section_topic_reply和我的link_to中我添加了_path.现在这是我无法弄清楚的.我通过什么参数?不应该是:
<%= link_to 'Edit', edit_section_topic_reply_path(@reply, @topic, @section) %>
Run Code Online (Sandbox Code Playgroud)
我得到一个ActionController::RoutingError在Topics#show我这样做的时候.
No route matches {:topic_id=>#<Topic id: 2, section_id: 2, user_id: nil, subject: "subject", body: "body", created_at: "2011-03-04 08:37:37", updated_at: "2011-03-04 21:37:16">, :controller=>"replies", :action=>"edit", :section_id=>nil, :id=>#<Section id: 2, name: "Section", description: "Section Description", created_at: "2011-03-04 07:50:56", updated_at: "2011-03-04 07:50:56">}
Run Code Online (Sandbox Code Playgroud)
好像它不是传递ID,而是之前的巢,我的新主题运行正常
new_section_topic_reply_path(@topic, @section)
Run Code Online (Sandbox Code Playgroud) 在围棋,switchES是比C(和C++)灵活得多,因为它们可以处理布尔表达式的情况下,更换大else- if梯看似完全,尤其是与默认switch {...}块.
switch {
case x < 5 && y > 2:
//...
case y == 1 || x > 2:
//...
default:
}
Run Code Online (Sandbox Code Playgroud)
使用switchOver else- ifin Go 有效率优势吗?似乎switch灵活性会提高效率.是否只是由编译器来弄清楚它是否可以制作跳转表?
使用switchover if和else?有任何性能优势吗?
我正在尝试创建一个回调样式API,这对于C++来说还是一个新手.我一直收到错误,error: invalid use of non-static member function但不确定接下来的步骤.我希望能够将成员函数作为参数传递给另一个类.
代码是这样的
class Button {
int buttonDownTime = 0;
int debounceTime = 2000;
...
template<typename Callback>
void debounce(Callback func) {
if (millis() - buttonDownTime > debounceTime) {
func();
}
}
}
class Player {
int playerCount = 0;
void incriment() {
playerCount++;
}
}
void loop() {
...
button.debounce(player.incriment);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
所以我想感谢大家到目前为止所有的答案,但是自从发布以来我学到了一些东西.Arduino的AVR不包括C++ <functional>.没有那个图书馆,这可能是一件事吗?
再次感谢你!
我试图将 configparser 和 argparse 结合起来用于脚本,以便 argparse 定义的各种参数的默认值存储在通过 configparser 操作的配置文件中。我遇到的问题是布尔选项。argparse 具有这些选项的store_true和store_false操作,它们会自动创建默认值并指定给定选项时要更改的内容。但是,由于默认值是从配置文件中读取的,因此我不知道要提前做什么才能使用这些操作。这会建议类似:
import argparse,configparser
config = configparser.ConfigParser()
config['DEFAULT']['test'] = 'False'
config.read('testing.cfg')
parser = argparse.ArgumentParser()
if config.getboolean('DEFAULT','test'):
parser.add_argument('-t',action='store_false', dest='test')
else:
parser.add_argument('-t',action='store_true', dest='test')
args = parser.parse_args()
print(args.test)
Run Code Online (Sandbox Code Playgroud)
parser.addargument但是,我不喜欢在条件中包含语句的想法(尤其是我拥有的这些选项越多,就越麻烦)。我更喜欢的是这样的:
parser.add_argument('-t',action='toggle_boolean',dest='test',default=config.getboolean('DEFAULT','test'))
Run Code Online (Sandbox Code Playgroud)
在这种情况下,toggle_boolean当给出参数时,该操作将切换布尔值的状态,无论它是什么。问题是所述操作 ( toggle_boolean) 不存在。我将如何定义这样的操作,或者是否有更好的方法来做到这一点?