小编Phi*_*ipp的帖子

ifstream:检查是否成功打开

一位同事告诉我这段代码:

std::ifstream stream(filename.c_str());
if (!stream)
{
    throw std::runtime_error("..");
}
Run Code Online (Sandbox Code Playgroud)

会错的.ifstream如果开放成功,他说评估为0.我的代码有效,但我想查找文档,但没有看到它说如何检查开放是否成功.你能指点我吗?

c++ iostream

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

#ifdef与CMake独立于平台的DEBUG

我正在使用CMake在Windows(Visual Studio)以及Linux机器(gcc)上构建我的项目.我想将一些代码标记为"仅调试",就像使用

#ifdef DEBUG
//some logging here
#endif
Run Code Online (Sandbox Code Playgroud)

问题是:CMake"Debug"构建类型中的所有平台上都有哪些编译器定义?DEBUG似乎不存在.(我希望只有在构建类型为Debug时才能进行日志记录或其他任何操作.)

c c++ cmake

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

在C++中修改const成员函数的引用成员

我正在研究我的代码的const正确性,只是想知道为什么这个代码编译:

class X
{
    int x;
    int& y;
public:
    X(int& _y):y(_y)
    {
    }
void f(int& newY) const
    {
        //x = 3; would not work, that's fine
        y = newY; //does compile. Why?
    }
};

int main(int argc, char **argv) 
{
    int i1=0, i2=0;
    X myX(i1);
    myX.f(i2);
...
}
Run Code Online (Sandbox Code Playgroud)

据我所知,f()正在改变对象myX,尽管它说是const.当我分配给y时,如何确保我的编译器抱怨?(Visual C++ 2008)

非常感谢!

c++ const reference

24
推荐指数
2
解决办法
2709
查看次数

将模板参数传递给宏的方法

我无法将Google Test的ASSERT_THROW()宏与多个模板参数结合使用.考虑一下我想确保Matrix<5,1>抛出的构造:

ASSERT_THROW(Matrix<5,1>(), std::runtime_error);
Run Code Online (Sandbox Code Playgroud)

(这个例子没有多大意义,当然这不应该抛出,但它是在简化我所拥有的之后留下的.)

我从MS VC++ 2008获得此输出:

warning C4002: too many actual parameters for macro 'ASSERT_THROW'
error C2143: syntax error : missing ',' before ';'
Run Code Online (Sandbox Code Playgroud)

虽然没有问题:

ASSERT_THROW(Matrix<1>(), std::runtime_error);
Run Code Online (Sandbox Code Playgroud)

我怎样才能克服这个问题?

谢谢!

c++ macros googletest

20
推荐指数
3
解决办法
5467
查看次数

不同目标中相同文件的不同编译标志

我想在两个不同的目标中包含一个.cpp文件(在运行CMake后成为两个VS项目).我想为这些项目设置不同的COMPILE_FLAGS.

但是,当我这样做的时候

SET_TARGET_PROPERTIES(myfile.cpp PROPERTIES COMPILE_FLAGS "flags1")
ADD_EXECUTABLE(project1 myfile.cpp)
SET_TARGET_PROPERTIES(myfile.cpp PROPERTIES COMPILE_FLAGS "flags2")
ADD_EXECUTABLE(project2 myfile.cpp)
Run Code Online (Sandbox Code Playgroud)

"flags2"适用于这两个项目,因此看起来第3行中的属性被覆盖而第2行没有考虑.这是真的还是我错过了什么?有办法解决这个问题吗?

谢谢!

cmake

18
推荐指数
2
解决办法
7341
查看次数

屏幕关闭时停止侦听指纹

我的应用程序的用户报告说,当我的应用程序正在侦听指纹身份验证(我已经呼叫fingerprintManager.authenticate)并且屏幕已关闭(通过按设备电源开关按钮)时,无法使用指纹解锁设备.

我还可以看到在屏幕关闭时调用onAuthenticationError回调方法,这在我离开活动时不会发生,因为我调用CancellationSignal.cancel()了我的onPause方法.我已经检查过了onPause.

在指纹对话框示例中可以观察到相同的行为(https://github.com/xamarin/monodroid-samples/tree/master/android-m/FingerprintDialog,移植自https://github.com/googlesamples/android- FingerprintDialog)

我该怎么做才能解决这个问题?

编辑:我还尝试注册一个android.intent.action.SCREEN_OFF的广播接收器,它在onPause之后得到通知,因此调用cancel()该接收器不会改变任何东西也就不足为奇了.

android fingerprint

18
推荐指数
2
解决办法
5436
查看次数

教程/手册如何在autoexp.dat中创建Visualizer

我有一些C++数据类型,我想改善我的团队的调试经验.因此,我想在autoexp.dat文件中创建自定义可视化工具.[AutoExpand]部分似乎不够,所以我开始查看[Visualizer].我发现这个网站有一些解释,但是有没有全面的参考/手册/教程?例如,我没有得到$ c和$ e之间的区别.我已经成功地展示了一些基本信息,但我觉得还有更多要知道......

你知道什么好资源吗?

谢谢!

c++ visual-studio-2008 visual-studio

15
推荐指数
1
解决办法
7408
查看次数

Android KeyStoreException:

我的应用程序使用Android的密钥库在使用指纹进行身份验证后加密某些数据.这似乎适用于大多数设备,但我收到了OnePlus2用户的错误报告,但有例外

android.security.KeyStoreException: Signature/MAC verification failed
    at android.security.KeyStore.getKeyStoreException(KeyStore.java:632)
    at android.security.keystore.KeyStoreCryptoOperationChunkedStreamer.update(KeyStoreCryptoOperationChunkedStreamer.java:132)
    at android.security.keystore.KeyStoreCryptoOperationChunkedStreamer.doFinal(KeyStoreCryptoOperationChunkedStreamer.java:217)
    at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:473)
    at javax.crypto.Cipher.doFinal(Cipher.java:1502)
Run Code Online (Sandbox Code Playgroud)

我的代码基本上是这样的(用Mono for Android编写):

Cipher _cipher = Cipher.GetInstance(KeyProperties.KeyAlgorithmAes + "/"
                                              + KeyProperties.BlockModeCbc + "/"
                                              + KeyProperties.EncryptionPaddingPkcs7);

KeyStore _keystore = KeyStore.GetInstance("AndroidKeyStore");
FingerprintManager _fingerprintManager = (FingerprintManager) Context.GetSystemService(Context.FingerprintService);

_keystore.Load(null);
var key = _keystore.GetKey(_keyId, null);
_cipher.Init(CipherMode.EncryptMode, key);
_cryptoObject = new FingerprintManager.CryptoObject(_cipher);
_fingerprintManager.Authenticate(_cryptoObject, _cancellationSignal, 0 /* flags */, this, null);

//OnAuthSucceeded:
var mySecret = _cipher.DoFinal(System.Text.Encoding.UTF8.GetBytes(textToEncrypt));
Run Code Online (Sandbox Code Playgroud)

代码有什么问题吗?这个例外是什么意思?

encryption android android-fingerprint-api

15
推荐指数
1
解决办法
2698
查看次数

便携式存档不在GCC下编译

我需要(在)Windows和Linux上(de)序列化数据(并在其间传输文件).我想使用Boost序列化库的可移植二进制存档,可以在示例中找到,例如参见http://boost-doc-zh.googlecode.com/svn-history/r380/trunk/libs/serialization/example /

这适用于Windows(VS 2008),但无法在GCC 4.3.2下编译,但有以下错误.

有人可以提出解决方案吗?

非常感谢!

/projects/lib/BOOST/1_44_0/include/boost/archive/basic_archive.hpp: In member function 'void portable_binary_iarchive::init(unsigned int)':
/projects/lib/BOOST/1_44_0/include/boost/archive/basic_archive.hpp:78: error: 'uint_least32_t boost::archive::version_type::t' is private
/home/myfolder/src/portable_binary_iarchive.cpp:92: error: within this context
/home/myfolder/src/portable_binary_iarchive.hpp: In member function 'void portable_binary_iarchive::load(T&) [with T = boost::archive::class_id_type]':
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/iserializer.hpp:107:   instantiated from 'static void boost::archive::load_access::load_primitive(Archive&, T&) [with Archive = portable_binary_iarchive, T = boost::archive::class_id_type]'
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/iserializer.hpp:356:   instantiated from 'static void boost::archive::detail::load_non_pointer_type<Archive>::load_primitive::invoke(Archive&, T&) [with T = boost::archive::class_id_type, Archive = portable_binary_iarchive]'
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/iserializer.hpp:433:   instantiated from 'static void boost::archive::detail::load_non_pointer_type<Archive>::invoke(Archive&, T&) [with T = boost::archive::class_id_type, Archive = portable_binary_iarchive]'
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/iserializer.hpp:586:   instantiated …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-serialization

11
推荐指数
1
解决办法
548
查看次数

将模板化对象存储为成员对象

假设你有这样的代码:

struct Manager
{
  template <class T> 
  void doSomething(T const& t)
  {
    Worker<T> worker;
    worker.work(t);
  }
};
Run Code Online (Sandbox Code Playgroud)

"管理器"对象创建一次,并使用一些不同类型"T"调用,但每种类型T被多次调用.这可能是简化形式,如

Manager manager;
const int N = 1000;
for (int i=0;i<N;i++)
{
  manager.doSomething<int>(3);
  manager.doSomething<char>('x');
  manager.doSomething<float>(3.14);
}
Run Code Online (Sandbox Code Playgroud)

现在分析表明,构建一个Worker<T>是一个耗时的操作,应该避免构造它N次(内doSomething<T>).出于线程安全的原因,可以使用一个Worker<int>,一个Worker<char>Worker<float>每个"管理器",但不是一个Worker<int>适用于所有管理器.所以通常我会把"worker"变成一个成员变量.但是我怎么能在上面的代码中这样做呢?(我事先不知道会使用哪个"T").

我找到了一个使用std :: map的解决方案,但它不是完全类型安全的,当然也不是很优雅.在Worker<T>没有虚拟方法的情况下,你能建议一种类型安全的方式而不是每个"T" 构建一次吗?

(请注意,Worker不是从任何模板参数的免费基类派生的).

谢谢你的解决方案!

c++ performance

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