我正在编写一个智能ptr模板,该模板仅用于给定基类及其子类的实例化,它为模板{{1}的变体MyPtr<U>
提供类似boost :: shared_ptr的隐式转换。只要转换从T *到U *有效(有效的基类和const兼容)。
这在vs2005中工作得很好,但在linux上没有使用g ++,所以我的同事在那里改变了它,但这样做打破了const-correctness。
我的问题是,我想要对某些转换无效进行单元测试(例如,将MyPtr<T>
分配给MyPtr<const T>
),从而导致文件无法编译!但是你不能在解决方案中编译文件......
如果某些VS特定的#pragma或某些SFINAE技巧可以测试给定的构造 NOT 有效,因此无法编译?
谢谢, - DD
答案 0 :(得分:1)
您可以运行命令行编译器cl
,这很容易设置,并捕获其错误消息输出。
没有makefile,几乎没有来自解决方案/项目的任何信息。只是包含路径和源文件。最简单的是你只需要一个程序来“反转”另一个程序的退出代码:
#include <sstream>
#include <stdlib.h>
int main(int argc, char *argv[])
{
std::ostringstream command;
for (int n = 1; n < argc; n++)
command << argv[n] << " ";
return (system(command.str().c_str()) == EXIT_SUCCESS)
? EXIT_FAILURE : EXIT_SUCCESS;
}
它只是将传递给它的参数重构为(省略自己的名称)并退出生成的命令行,然后如果失败则返回成功,如果成功则失败。这足以欺骗Visual Studio或make
。
从技术上讲,重新构造的命令行应该引用参数,但只有在疯狂到在构建目录或源文件名中放置空格时才需要这样做!
答案 1 :(得分:0)
如果一个给定的参数(在你的'const T'的情况下)会满足你正在寻找的所有其他单元测试,那么这不是一个完全可以接受的情况的标志吗? 换句话说,如果它有效,为什么禁止它?