如何验证某些模板对于给定的参数类型是否*不*编译?

时间:2009-05-12 22:22:43

标签: c++ visual-studio templates

我正在编写一个智能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

2 个答案:

答案 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'的情况下)会满足你正在寻找的所有其他单元测试,那么这不是一个完全可以接受的情况的标志吗? 换句话说,如果它有效,为什么禁止它?