cppyy 和 std::is_same_v (C++17)

Posted

技术标签:

【中文标题】cppyy 和 std::is_same_v (C++17)【英文标题】:cppyy and std::is_same_v (C++17) 【发布时间】:2021-10-26 19:59:25 【问题描述】:

如果我在 Ubuntu 20.04 系统上的 cppyy v1.6.2 中运行以下测试脚本:

#!/usr/bin/python3

import cppyy

cppyy.cppdef("""
struct Test  
 void test() const 
  std::cout << std::is_same<int,double>::value << std::endl; // works
  std::cout << std::is_same_v<int,double> << std::endl;      // doesn't work
  
;
""");

tt = cppyy.gbl.Test()
tt.test()

我收到以下错误消息:

input_line_21:5:21: error: no member named 'is_same_v' in namespace 'std'
  std::cout << std::is_same_v<int,double> << std::endl;      // doesn't work
               ~~~~~^
input_line_21:5:34: error: expected '(' for function-style cast or type construction
  std::cout << std::is_same_v<int,double> << std::endl;      // doesn't work
                              ~~~^
Traceback (most recent call last):
  File "./test.py", line 18, in <module>
    tt = cppyy.gbl.Test()
AttributeError: <namespace cppyy.gbl at 0x45baf10> has no attribute 'Test'. Full details:
  type object '' has no attribute 'Test'
  'Test' is not a known C++ class
  'Test' is not a known C++ template
  'Test' is not a known C++ enum

因为我在上面突出显示的那一行。其他一切正常。

我知道std::is_same_v 是 C++17,但在 cppyy/cling 网页上我发现支持 C++17 的声明。到底是怎么回事? C++17 不能在 cppyy 中工作吗?这个可以配置吗?是否只有 C++17 的一个子集可用?

对于我的项目,C++17 至关重要...

【问题讨论】:

这是否发生在 Windows 上?参考:cppyy.readthedocs.io/en/latest/… 正如我在帖子中所写的,我使用的是 Ubuntu 20.04。我手头没有 Windows,所以我不知道。 在此之前是否包含了 type_traits?我从未使用过 cppy,但来自cppyy.readthedocs.io/en/latest/starting.html。我认为您需要添加:cppy.include('type_traits')) 【参考方案1】:

为什么要使用 cppyy 1.6.2?最新版本是 2.1.0。两者之间的一个很大区别是后者的 Clang 底层版本要新得多(后者也使得启用 c++2a 成为可能,甚至)。也就是说,1.6.2 和 2.1.0 对我来说上面的代码都没有问题,所以很可能是安装/构建问题。

首先,验证您的安装/构建中是否启用了 C++17。例如。像这样:

$ python
>>> import cppyy
>>> cppyy.gbl.gInterpreter.ProcessLine('__cplusplus')

如果启用了 C++17,结果应该是 201703 或更高。

如果不是,请重新安装,例如使用 pip,假设您仍然想要 1.6.2(否则删除显式版本):

$ STDCXX=17 python -m pip install cppyy==1.6.2 --no-cache-dir --force-reinstall

请注意,如果您的系统编译器(在构建 CPyCppyy 时使用)不支持 C++17,它仍会根据需要逐步降低到 C++14 或 C++11,即使使用 STDCXX=17

【讨论】:

在使用STDCXX=17 python -m pip install cppyy 安装 cppyy 2.1.0 时,我验证了 OP:s 程序按原样运行。 啊哈,我刚开始用 pip 安装的。但是 __cplusplus 是 201402。虽然这是原因,但我不确定为什么 pip 没有直接自动选择最新版本。我现在尝试更新。 更糟的是,我很抱歉。我让 PYTHONPATH 指向一个非常旧的 ROOT 安装,其中包含一个非常过时的 cppyy。这总是被捡起——不管我用 pip 安装了什么。现在,之后

以上是关于cppyy 和 std::is_same_v (C++17)的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 上安装 CPPYY 时出现 cmd 错误

关于SFINAE的功能和结构之间的差异

pyhonizing STL 向量等的 cppyy 源代码在哪里

如何在cppyy中加载库?

通过 C++ pythonization 回调将 operator() 的 cppyy 自动映射恢复到 __getitem__

VS2015 c/c++代码问题 win8.1系统