gpt4 book ai didi

c++ - 如何验证某些模板是否*不*针对给定的参数类型进行编译?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:37:34 27 4
gpt4 key购买 nike

我正在编写一个智能 ptr 模板,它旨在仅为给定的基类及其子类实例化,它提供对变体的类似于 boost::shared_ptr 的隐式转换 MyPtr<U>模板的MyPtr<T>只要从 T* 到 U* 的转换有效(有效的基类和 const 兼容)。

这在 vs2005 中运行良好,但在 linux 上与 g++ 不兼容,所以我的同事在那里更改了它,但这样做破坏了常量正确性。

我的问题是我想对某些转换无效进行单元测试(例如将 MyPtr<const T> 分配给 MyPtr<T>),导致文件无法编译!但是您不能在解决方案中不编译文件...

如果有一些特定于 VS 的 #pragma 或一些 SFINAE 技巧可以测试给定的构造是有效的,因此不会编译?

谢谢,--DD

最佳答案

您可以运行命令行编译器 cl,它很容易设置,并捕获其错误消息输出。

没有生成文件,几乎没有来自解决方案/项目的任何信息。只是包含路径和源文件。最简单的是,您只需要一个“反转”另一个程序的退出代码的程序:

#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

从技术上讲,重构的命令行应该引用参数,但只有当你足够疯狂到在你的构建目录或源文件名中放置空格时才有必要这样做!

关于c++ - 如何验证某些模板是否*不*针对给定的参数类型进行编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/855171/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com