std::make_shared<POD>()值是否初始化了我的POD?
如果是,这是否由标准保证?
如果没有(我怀疑),有没有办法做到这一点?我想std::make_shared<POD>(POD())会这样做但是我应该做什么?
boost::optional<T>(1.51)提供了一种构建对我的用户非常危险的对象的方法,我想阻止它.假设我有自己的整数类,我想传递一个可选的这样的整数并将其存储在某个类中:
class myint {
public:
int m_a;
myint (int r_a) : m_a(r_a) {
}
};
struct myclass {
boost::optional<myint> content;
myclass (const boost::optional<myint>& arg) : content(arg) {
}
};
Run Code Online (Sandbox Code Playgroud)
现在,这是用户如何使用该类:
myclass(myint(13)); //correct use
myclass(boost::none); //correct use
myclass(myint(0)); //correct use
myclass(0); //INCORRECT use, this easy typo
//equates boost::none which
//is not what the user meant
Run Code Online (Sandbox Code Playgroud)
我想了解这里发生了什么,并防止这种行为.
有趣的是,
myclass(1); //does not compile
Run Code Online (Sandbox Code Playgroud)
boost::none对于我的领域来说,这完全是一个有效的价值,但是boost::none当用户试图输入时,有一个偷偷摸摸的东西0是极其误导和危险的.
意图可能有点隐藏,因为我并没有真正推出一个myint课程而且我真的class myclass没有任何目的.无论如何,我需要向函数发送10个左右的可选ints,并且重复数据删除不起作用.(你可以想象我问你的年龄,身高和财富,还有三个特殊按钮可以检查你是否不想回答问题)
我发布了一个似乎在下面工作的答案(根据Mooing的Duck&Ilonesmiz建议,但更轻).不过,我很高兴听到有关它的评论.
假设我正在设计一个供其他人使用的对象集合,并假设我已阅读并理解(呵呵?)关于operator ==和Equals()之间差异的大多数线程,为什么我应该实现operator ==?
从这个线程中窃取一个例子,使用它可能非常容易出错:
object x = "hello";
object y = 'h' + "ello"; // ensure it's a different reference
(x == y); // evaluates to FALSE
string x = "hello";
string y = 'h' + "ello"; // ensure it's a different reference
(x == y); // evaluates to TRUE
Run Code Online (Sandbox Code Playgroud)
那么,我可以告诉我的用户只使用Equals()和ReferenceEquals(),那就是它吗?我在那里错过了什么?
是否有可能使用==的标准代码库的部分并且没有办法绕过它?
在某些重要案例中,==表现更好吗?(好吧,好吧,Equals是虚拟的,所以它总是会慢一点,但我看不出任何实际上成为瓶颈的用例)
下面是我在一个活动的onResume()部分将SurfaceTextureListener附加到TextureView的实验.
新开始:表面纹理可用("onSurfaceTextureAvailable")
取向变化:正如我所料,表面纹理被破坏("onSurfaceTextureDestroyed"),然后表面纹理可用("onSurfaceTextureAvailable").
现在,这让我感到惊讶:
在这些条件下,我保证旧的SurfaceTexture是否有效?如何确保我确实知道我的SurfaceTexture何时可用?为什么方向更改与任务切换不同,我应该如何知道?
public class MainActivity extends AppCompatActivity {
private final String TAG = "MainActivity";
TextureView mTextureView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextureView = (TextureView) findViewById(R.id.textureView);
}
@Override
public void onResume() {
super.onResume();
mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
Log.d(TAG, "onSurfaceTextureAvailable");
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
Log.d(TAG, "onSurfaceTextureSizeChanged");
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
Log.d(TAG, "onSurfaceTextureDestroyed");
return …Run Code Online (Sandbox Code Playgroud) 为什么以下开关甚至编译默认情况,因为它涵盖了枚举类的所有项目?我本来会认为这是enum class首先拥有强大的原因。
至于为什么我想要违约,即使我知道我涵盖了所有情况:这可以保护我免受我未来的粗心(以及其他同事的粗心)
enum class E {
a,
b
};
int main()
{
E c = E::b;
switch (c) {
case E::a:
case E::b:
std::cout << "pass" << std::endl;
break;
default:
static_assert(false, "This explodes!");
}
}
Run Code Online (Sandbox Code Playgroud)
由于某些我无法理解的原因,下图中的Viewpager会因菜单的大小而溢出。我可能没有描绘任何东西,但看不到。
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="160dp"
android:paddingTop="@dimen/appbar_padding_top"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="wrap_content"
android:layout_height="160dp"
>
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
/>
Run Code Online (Sandbox Code Playgroud)
在重写过程中我偶然发现了以下ES6方法:
async getUsers(res) {
User.findAll().then(users => res.json(users));
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎有点儿麻烦.我原以为是:
async getUsers(res) {
return User.findAll().then(users => res.json(users));
}
Run Code Online (Sandbox Code Playgroud)
但是,我知道async有许多技巧,比如自动包装承诺,我的直觉也是正确的吗?
我拥有有时可能会失败的步进功能,我想将此记录在(发电机)数据库中。方便的是,如果我可以创建一个新的错误处理步骤,而那个家伙只是从某个地方(在上下文中找不到它)拿起“执行名称”,并将其记录为失败。
那可能吗?
我有一个C++软件,可以使用不同的操作系统,平台和编译器进行编译.现在有时编译器会出现错误,例如这个错误,这意味着gcc版本4.6.4之前和4.7.3之前是不行的.现在我可以包含一个显示错误的单元测试(也许这个问题将揭示确实这就是我应该做的事情),但这是一项繁琐的工作:编译器错误有时难以重现并且将其转换为单元测试可能不会很容易......当你手头有平台和编译器时就是这样.
我正在寻找的是一个存储库,告诉我哪些版本的g ++,clang ++和msvc ++遭受了支持C++ 11的致命错误(我不是在谈论缺少的功能,当功能不存在时我会解决它们) .在构建系统中使用它们构建时,我会致命崩溃.不错的功能是,我甚至没有被迫发现一个禁止编译器的bug(所以我为自己节省了未来的麻烦).
这样的清单是否存在?
为了测试网络应用程序,我编写了一个asio端口"proxy":它在套接字上侦听应用程序客户端活动,并将所有传入的数据包发送到应用程序服务器监听的另一个套接字,然后返回.
现在,当应用程序或服务器因各种原因断开连接时,"代理"通常会获得EOF,但有时会收到"连接重置".
因此,问题是:套接字何时因"连接重置"错误而失败?
c++ ×4
c++11 ×3
android ×2
async-await ×1
aws-lambda ×1
boost ×1
build ×1
c# ×1
enums ×1
es6-class ×1
javascript ×1
linux ×1
networking ×1
shared-ptr ×1
sockets ×1