在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只用开关编译,可能需要更多东西?
根据这个答案,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) 有没有办法以某种方式钩住一些winapi或类似的东西来获取应用程序pid \name\path调用打印作业或获取文件数据,这是发送到打印而不通过驱动程序转换(即如果我打印excel表,我想拦截XLS文件,而不是postscript\pcl\printer的东西).
我正在使用redmon,我真的错过了我的项目的这些信息.
我对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添加到列表中。任何建议将非常欢迎。
想象一下这段代码:
#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 …
此代码示例正常工作并完成它应该执行的操作.
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)
没有一些丑陋的黑客可能吗?
在求职面试中,我对这个问题感到不知所措:
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)变化.解释将非常感激.
我正在编写简单的同步 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
我正在浏览一个不再与该公司合作的超级明星开发的遗留代码.通过他的代码,他已经打包了结构.但是我看到他为结构成员做了这个,只有1个元素.我不确定他这样做是否有任何好处.我错过了什么吗?
示例代码:
struct A {
uint32_t a __attribute__((packed));
};
Run Code Online (Sandbox Code Playgroud)