我正在试验C++ 11的新功能.在我的设置中,我真的很想使用继承构造函数,但遗憾的是没有编译器实现这些.因此,我试图模拟相同的行为.我可以这样写:
template <class T>
class Wrapper : public T {
public:
template <typename... As>
Wrapper(As && ... as) : T { std::forward<As>(as)... } { }
// ... nice additions to T ...
};
Run Code Online (Sandbox Code Playgroud)
这很有用......大多数时候.有时使用Wrapper类的代码必须使用SFINAE来检测如何Wrapper<T>构造这样的代码.然而,存在以下问题:就重载决策而言,构造函数Wrapper<T>将接受任何参数 - 但是如果不能使用那些构造类型,则编译失败(并且这不包括在SFINAE中)T.
我试图使用有条件地启用构造函数模板的不同实例化 enable_if
template <typename... As, typename std::enable_if<std::is_constructible<T, As && ...>::value, int>::type = 0>
Wrapper(As && ... as) // ...
Run Code Online (Sandbox Code Playgroud)
哪个工作正常,只要:
T是publicT 不是抽象的我的问题是:如何摆脱上述两个限制?
我试图克服所述第一通过检查(使用SFINAE和sizeof())是否表达new T(std::declval<As &&>()...) …
c++ templates template-meta-programming perfect-forwarding c++11
尝试ptrace()系统调用,我试图跟踪同一进程的另一个线程.根据手册页,跟踪器和tracee都是特定的线程(不是进程),所以我没有看到它不应该工作的原因.到目前为止,我尝试过以下方法:
PTRACE_TRACEME从clone()d子:调用成功,但不会做我想做的,可能是因为要被跟踪线程的父母是不是叫线程clone()PTRACE_ATTACH或PTRACE_SEIZE来自父线程:EPERM即使进程以root用户身份运行,也始终失败prctl(PR_SET_DUMPABLE, 1)在所有情况下,waitpid(-1, &status, __WALL)失败ECHILD(在明确传递子pid时相同).
我该怎么做才能让它发挥作用?
如果它根本不可能,是通过设计或内核中的错误(我使用的是3.8.0版本).在前一种情况下,你能指出我的文档的正确位置吗?
我使用外部库来处理大量数据.数据由原始指针传入,加上长度.该库不声明指针的所有权,但在完成数据时调用提供的回调函数(具有相同的两个参数).
通过使用方便地准备数据std::vector<T>,我宁愿不放弃这种便利.复制数据是完全不可能的.因此,我需要一种方法来"接管"一个拥有的内存缓冲区std::vector<T>,并且(稍后)在回调中释放它.
我目前的解决方案如下:
std::vector<T> input = prepare_input();
T * data = input.data();
size_t size = input.size();
// move the vector to "raw" storage, to prevent deallocation
alignas(std::vector<T>) char temp[sizeof(std::vector<T>)];
new (temp) std::vector<T>(std::move(input));
// invoke the library
lib::startProcesing(data, size);
Run Code Online (Sandbox Code Playgroud)
并且,在回调函数中:
void callback(T * data, size_t size) {
std::allocator<T>().deallocate(data, size);
}
Run Code Online (Sandbox Code Playgroud)
这个解决方案有效,因为标准分配器的deallocate函数忽略了它的第二个参数(元素计数)并且只是调用::operator delete(data).如果没有,可能会发生坏事,因为size输入向量可能比它小得多capacity.
我的问题是:是否有一种可靠的(以及C++标准)接管缓冲区std::vector并在以后"手动"释放它的方式?
以下代码示例:
interface I<out T>
where T : class, I<T>
{
T GetT();
}
interface J : I<J>
{
}
abstract class B<T> : I<T>
where T : B<T>
{
T I<T>.GetT()
{
return null;
}
}
class C : B<C>, J
{
}
Run Code Online (Sandbox Code Playgroud)
无法编译(在VS2010 SP1下),出现以下错误:
Error 4 'C' does not implement interface member 'I<J>.GetT()'
Run Code Online (Sandbox Code Playgroud)
但是,C确实实现了(通过它的基础B <C>)I <C>,由于我被声明为协变,它也应该捕获I <J>(如C:J).
这是编译器错误吗?如果没有,为什么我不被允许这样做?