小编Grz*_*man的帖子

检测(可能是抽象的)基类的受保护构造函数

我正在试验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)

哪个工作正常,只要:

  • 适当的构造函数Tpublic
  • T 不是抽象的

我的问题是:如何摆脱上述两个限制?

我试图克服所述第一通过检查(使用SFINAE和sizeof())是否表达new T(std::declval<As &&>()...) …

c++ templates template-meta-programming perfect-forwarding c++11

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

ptrace来自另一个的一个线程

尝试ptrace()系统调用,我试图跟踪同一进程的另一个线程.根据手册页,跟踪器和tracee都是特定的线程(不是进程),所以我没有看到它不应该工作的原因.到目前为止,我尝试过以下方法:

  • 使用PTRACE_TRACEMEclone()d子:调用成功,但不会做我想做的,可能是因为要被跟踪线程的父母是不是叫线程clone()
  • 使用PTRACE_ATTACHPTRACE_SEIZE来自父线程:EPERM即使进程以root用户身份运行,也始终失败prctl(PR_SET_DUMPABLE, 1)

在所有情况下,waitpid(-1, &status, __WALL)失败ECHILD(在明确传递子pid时相同).

我该怎么做才能让它发挥作用?

如果它根本不可能,是通过设计或内核中的错误(我使用的是3.8.0版本).在前一种情况下,你能指出我的文档的正确位置吗?

multithreading ptrace

12
推荐指数
1
解决办法
1097
查看次数

从std :: vector接管内存

我使用外部库来处理大量数据.数据由原始指针传入,加上长度.该库不声明指针的所有权,但在完成数据时调用提供的回调函数(具有相同的两个参数).

通过使用方便地准备数据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并在以后"手动"释放它的方式?

c++ stdvector allocator c++11

12
推荐指数
1
解决办法
2430
查看次数

界面协方差问题

以下代码示例:

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).

这是编译器错误吗?如果没有,为什么我不被允许这样做?

covariance c#-4.0

5
推荐指数
1
解决办法
954
查看次数