小编Sta*_*ght的帖子

为什么这个SFINAE片段不能用于g ++,而是在MSVC中工作?

在MSVC2017中,这工作正常,两个static_asserts都没有按预期触发:

template <typename T>
struct do_have_size {
    template <typename = decltype(std::declval<T>().size())>
    static std::true_type check(T);
    static std::false_type check(...);
    using type = decltype(check(std::declval<T>()));
};

int main() {
    using TR = typename do_have_size<std::vector<int>>::type;
    using FL = typename do_have_size<int>::type;

    static_assert(std::is_same<TR, std::true_type>::value, "TRUE");
    static_assert(std::is_same<FL, std::false_type>::value, "FALSE");
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我在g ++ 7.1或clang 4.0中编译,我会得到以下编译器错误:

In instantiation of 'struct do_have_size<int>':
20:39:   required from here
9:24: error: request for member 'size' in 'declval<do_have_size<int>::TP>()', which is of non-class type 'int'
Run Code Online (Sandbox Code Playgroud)

根据我对SFINAE的理解,true_type返回函数的替换应该对int参数失败,并且应该选择下一个函数,就像在MSVC中一样.为什么clang和g ++根本没有编译它?

-std=c++17只用开关编译,可能需要更多东西?

c++ templates sfinae c++11

19
推荐指数
3
解决办法
1520
查看次数

为什么decltype(a,b)被评估为参考?

根据这个答案,ref应该是一个int.

但由于某种原因,它int&在gcc和MSVC2015中decltype(b)进行了评估,而 正确评估为正确int.为什么这样?

int a = 1, b = 2;
decltype(a, b) ref; // ref is int&
decltype(b) var;    // var is int
Run Code Online (Sandbox Code Playgroud)

c++ decltype c++11

14
推荐指数
2
解决办法
629
查看次数

获取调用打印的应用程序的名称(路径)

有没有办法以某种方式钩住一些winapi或类似的东西来获取应用程序pid \name\path调用打印作业获取文件数据,这是发送到打印而不通过驱动程序转换(即如果我打印excel表,我想拦截XLS文件,而不是postscript\pcl\printer的东西).

我正在使用redmon,我真的错过了我的项目的这些信息.

windows printing

8
推荐指数
1
解决办法
82
查看次数

无法理解如何向std :: list &lt;std :: unique_ptr &lt;classname &gt;&gt;添加新对象

我对unique_ptr的std :: list有一个奇怪的问题。

slFlyingMonster类是从slMonster类派生的。

以下代码有效:

std::unique_ptr<slMonster> ptr(new slFlyingMonster(md));
Run Code Online (Sandbox Code Playgroud)

但是这段代码:

std::list<std::unique_ptr<slMonster>> mMonsters;
mMonsters.push_back(new slFlyingMonster(md));
Run Code Online (Sandbox Code Playgroud)

引发错误:

“错误1错误C2664:'void
std :: list>,std :: allocator >>> :: push_back(const std :: unique_ptr <_Ty,std :: default_delete <_Ty >>&)':无法从'slFlyingMonster *'到'std :: unique_ptr> &&'“

据我了解,这是错误的,例如std :: list.push_back()与=不同,但是我无法弄清楚如何正确地将新类作为unique_ptr添加到列表中。任何建议将非常欢迎。

c++ stl unique-ptr c++11

4
推荐指数
2
解决办法
1191
查看次数

Variadic模板选择更常见的模板而不是重载

想象一下这段代码:

#include <iostream>
void PrintInternal() {
    std::cout << std::endl;
}

template <typename T, typename...ARGS>
void PrintInternal(const T& head, const ARGS&...rest) {
    std::cout << head << " ";
    PrintInternal(rest...);
};

template <typename...ARGS>
void PrintInternal(const double& head, const ARGS&...rest) {
    std::cout << "DBL!!! " << head << " ";
    PrintInternal(rest...);
}

template <typename...ARGS>
void Print(const ARGS&...args) {
    PrintInternal(args...);
}

int main() {
    Print(1.1, 2, 3.3, 4);
    Print(0, 1.1, 2, 3.3, 4);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

第一Print产出:

DBL!1.1 2 3.3 4

我的期望是,它会输出DBL!3.3之前或没有DBL …

c++ templates variadic-templates c++11

3
推荐指数
1
解决办法
72
查看次数

是否可以从构造函数中自动推导出基类模板参数?

此代码示例正常工作并完成它应该执行的操作.

template <typename T>
struct base {
    base(T a) {};
};

struct b : public base<int> {
    b() : base(3) {};
};
Run Code Online (Sandbox Code Playgroud)

我想利用构造函数中的自动演绎模板参数来使用C++ 17特性,并执行以下操作:

struct b : public base { // note lack of <int>
    b() : base(3) {};
};
Run Code Online (Sandbox Code Playgroud)

没有一些丑陋的黑客可能吗?

c++ templates c++17

3
推荐指数
1
解决办法
116
查看次数

具有虚析构函数的派生类的sizeof

在求职面试中,我对这个问题感到不知所措:

bool Res - 它向我们展示了什么?

template <class T>
class R
{
        class A: public T {
                virtual ~A(){}
        };
public:
        static const bool Res = sizeof(A) == sizeof(T);
};
Run Code Online (Sandbox Code Playgroud)

在我调查期间 - 我一直有sizeof(T)== 1,而sizeof(A)变化.解释将非常感激.

c++

2
推荐指数
1
解决办法
228
查看次数

boost::asio 同步服务器在第一个之后不接受连接

我正在编写简单的同步 asio 服务器。工作流程如下 - 在无限循环中接受连接并为每个连接创建线程。我知道,这不是那么理想,但异步对我来说太难了。

这是我丑陋的代码:

std::vector<asio::io_service*> ioVec;
std::vector<std::thread*> thVec;
std::vector<CWorker> workerVec;
std::vector<tcp::acceptor*> accVec;

while (true) {
    ioVec.emplace_back(new asio::io_service());
    accVec.emplace_back(new tcp::acceptor(*ioVec.back(), tcp::endpoint(tcp::v4(), 3228)));
    tcp::socket* socket = new tcp::socket(*ioVec.back());
    accVec.back()->accept(*socket);
    workerVec.push_back(CWorker());
    thVec.emplace_back(new std::thread(&CWorker::run, &workerVec.back(), socket));
}
Run Code Online (Sandbox Code Playgroud)

问题是第一次连接完成,它被正确接受,线程被创建,一切都很好。断点在“accept()”字符串上正确触发。但是,如果我想创建第二个连接(第一个连接是否 DCed 无关紧要)-> telnet 已连接,但未触发下一个“接受”字符串上的断点,并且连接没有响应任何内容。

所有这些向量的东西 - 我试图以某种方式调试以创建单独的接受器,任何连接的 io_service - 没有帮助。谁能指出我错误在哪里?

PS 视觉工作室 2013

c++ boost-asio

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

__attribute __((packed))在只有1个元素的结构上

我正在浏览一个不再与该公司合作的超级明星开发的遗留代码.通过他的代码,他已经打包了结构.但是我看到他为结构成员做了这个,只有1个元素.我不确定他这样做是否有任何好处.我错过了什么吗?

示例代码:

struct A { 
    uint32_t a __attribute__((packed));
};
Run Code Online (Sandbox Code Playgroud)

c++

0
推荐指数
1
解决办法
62
查看次数