以下标准是否符合要求?你能举这个部分吗?
struct A
{
virtual void func() = 0;
};
struct B
{
void func(){}
};
struct C : public A, public B
{
virtual void func(){ B::func(); }
};
Run Code Online (Sandbox Code Playgroud)
我在VS2010中得到了一个奇怪的编译器警告,它在同等但更复杂的代码中指向func
派生最多类中的声明:warning C4505: unreferenced local function has been removed
.我不知道为什么编译器认为在类中声明的虚函数是本地的; 但是我不能在一个更简单的例子中重复这个警告.
我想出了一个小警告的重复案例.假设它与函数隐藏有关,我认为我走错了路.这是repro案例:
template<typename T>
struct C
{
int GetType() const;
virtual int func() const; // {return 4;} // Doing this inline removes the warning <--------------
};
template<typename T>
int C<T>::GetType() const
{
return 0;
}
template<>
int …
Run Code Online (Sandbox Code Playgroud) 我正试图采用一种"任务"的风格std::async
并将其存放在容器中.我不得不跳过篮球来实现它,但我认为必须有更好的方法.
std::vector<std::function<void()>> mTasks;
template<class F, class... Args>
std::future<typename std::result_of<typename std::decay<F>::type(typename std::decay<Args>::type...)>::type>
push(F&& f, Args&&... args)
{
auto func = std::make_shared<std::packaged_task<typename std::result_of<typename std::decay<F>::type(typename std::decay<Args>::type...)>::type()>>(std::bind(std::forward<F>(f), std::forward<Args>(args)...));
auto future = func->get_future();
// for some reason I get a compilation error in clang if I get rid of the `=, ` in this capture:
mTasks.push_back([=, func = std::move(func)]{ (*func)(); });
return future;
}
Run Code Online (Sandbox Code Playgroud)
所以我正在使用bind
- > packaged_task
- > shared_ptr
- > lambda
- > function
.我怎样才能更好/更优化?如果有一个std::function
可以采取不可复制但可移动的任务,那肯定会更容易.我可以std :: forward …
我正试图尽快捕获调用堆栈.现在这就是我所拥有的:
void* addrs[10] = {};
DWORD hash;
RtlCaptureStackBackTrace(0, 10, addrs, &hash);
for( size_t i = 0; i <10; ++i )
{
std::cout << addrs[i] << '\n';
}
Run Code Online (Sandbox Code Playgroud)
这是用于内存跟踪系统,因此如果以后(在某些用户驱动的事件中)可以变成人类可读的东西,我最终会得到一个地址数组.
addrs
变成人类可读的东西?RtlCaptureStackBackTrace
?编辑:
我使用SymFromAddr
和将地址转换为人类可读的信息SymGetLineFromAddr64
.然而,我的版本new
,它使用CaptureStackBackTrace
大约需要30倍的时间比原来几乎所有的时间是因为堆栈跟踪.我还在寻找更快的解决方案!
目前我们只抛出由外部源(例如数据)导致的不可恢复的故障,并且在整个执行过程中只有一次尝试捕获.
何时/为什么/如何在现代C++中使用异常?
C++ 11是否改变了上述问题的答案?
一些通常的模板专业化如下:
template<class T>
class C
{
void common() { ... }
void f2 = delete;
};
template<>
class C<int>
{
void common() { ... }
void f1() { ... }
};
Run Code Online (Sandbox Code Playgroud)
可以表示static_if
为:
template<class T>
class C
{
void common() { ... }
static_if(std::is_same<T, int>::value)
{
void f1( ) { ... }
}
else
{
void f2( ) = delete;
}
}
Run Code Online (Sandbox Code Playgroud)
这些是直接竞争的功能吗?模板专业化static_if
可以做些什么不可以吗?似乎static_if
可以做模板专业化所能做的一切,还有更多.
暂且不说:我不喜欢static_if
在这种情况下,因为它可能使得在任何特定情况下你可以使用界面的哪些部分是不明显的.在某些情况下,模板特化仍然可以提供更清晰的语法.
我正在使用MediaCodec
来自相机的视频编码:
MediaFormat format = MediaFormat.createVideoFormat("video/avc", width, height);
format.setInteger(MediaFormat.KEY_BIT_RATE, 250000);
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1);
format.setInteger(MediaFormat.KEY_FRAME_RATE, 15);
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
_mediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
Run Code Online (Sandbox Code Playgroud)
我发现根据我给出的分辨率,有一些最小有效比特率要设置.如果我在该数量下设置比特率,则完全被忽略.如果我将比特率设置为高于此不可见阈值,则按预期工作.我想要做的是查询我可以KEY_BIT_RATE
为任何给定分辨率设置的最小比特率.当我设置一个没有任何影响的比特率时,不会抛出任何错误或任何错误.
以下是weak_ptr的构造函数中的两个:http: //msdn.microsoft.com/en-us/library/bb982126.aspx
weak_ptr(const weak_ptr&);
template<class Other>
weak_ptr(const weak_ptr<Other>&);
Run Code Online (Sandbox Code Playgroud)
实际代码(来自memory
):
weak_ptr(const weak_ptr& _Other)
{ // construct weak_ptr object for resource pointed to by _Other
this->_Resetw(_Other);
}
template<class _Ty2>
weak_ptr(const weak_ptr<_Ty2>& _Other,
typename enable_if<is_convertible<_Ty2 *, _Ty *>::value,
void *>::type * = 0)
{ // construct weak_ptr object for resource pointed to by _Other
this->_Resetw(_Other);
}
Run Code Online (Sandbox Code Playgroud)
Q1:为什么顶级拷贝构造函数就在那里?它看起来像每个案例的底部(包括前一个).它甚至被调用了吗?如果它们没有包含它,那么底部的它会占据它的位置吗?
Q2:底层(模板化)构造函数的第二个参数发生了什么.我想我理解SFINAE方面,但我不明白为什么有一个额外的*之后::type
我正在尝试释放一个shared_ptr(您可以释放一个unique_ptr)。我知道当shared_ptr不唯一时这没有意义,但我有一个保证是唯一的shared_ptr。我试过了...
m_pObj.reset((T*)nullptr, [](T* const){});
Run Code Online (Sandbox Code Playgroud)
...但它只是删除了该对象。我不确定如果shared_ptr最终调用delete,删除器参数有什么用处。
有什么方法可以实现这一点(如果没有其他方法,欢迎使用VS2010特定的解决方案)。
模板类的方法是否隐含了inline
链接(不是在谈论内联优化),还是只是模板化的方法?
// A.h
template<typename T>
class A
{
public:
void func1(); // #1
virtual void func2(); // #2
template<typename T2> void func3(); // #3
};
template<typename T>
void A<T>::func1(){} // #1
template<typename T>
void A<T>::func2(){} // #2
template<typename T>
template<typename T2>
void A<T>::func3<T2>(){} // #3
Run Code Online (Sandbox Code Playgroud)
以上所有案例都是inline
[联系]吗?(我应该明确写inline
任何一个)?