Std::any in c++17 in ROOT and pyROOT

I compile ROOT from source by using the following settings:

cmake -Dbuiltin_afterimage=ON -Dxrootd=OFF -DCMAKE_INSTALL_PREFIX=../root_install -DCMAKE_CXX_COMPILER=g++ -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_STANDARD=17 and -Droot7=ON ../root_src

The compilation is successful. But following command failed:

root [3] std::any a(12)
ROOT_prompt_3:1:6: error: no member named ‘any’ in namespace ‘std’

std::any is a c++17 feature. I was assuming ROOT will be able to handle this after enable c++17.

_ROOT Version: root.6.28.08
_Platform: unbuntu
_Compiler:gcc9.4


emphasized text

root [0] #include <any>
root [1] std::any a(12)
(std::any &) @0x7fba7b256010

Thanks. adding the command #include solve the problem.
How to use std::any in pyROOT? I tried the following:

import ROOT
a = ROOT.std.any()
Traceback (most recent call last):
File “”, line 1, in
AttributeError: <namespace cppyy.gbl.std at 0x558f5c6b83a0> has no attribute ‘any’. Full details:
type object ‘std’ has no attribute ‘any’
‘std::any’ is not a known C++ class
‘any’ is not a known C++ template
‘any’ is not a known C++ enum

Try: ROOT.gROOT.ProcessLine('#include <any>')
or: ROOT.gInterpreter.ProcessLine('#include <any>')
or (better?): ROOT.gInterpreter.Declare('#include <any>')

@Axel What is actually the best way to deal with it? Via “gROOT” or “gInterpreter”? Using “ProcessLine” or “ProcessLineSynch” or “Declare”?

For header inclusion, Declare is probably best as it has less side-effects and tries to perform less magic behind the scenes.

Here is a follow up question on the format of std::vector or std::map in ROOT6.26.08 with c++17 turned on.

The following command doesn’t work:

>>> a = ROOT.std.vector[string]()
       Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
        NameError: name 'string' is not defined

but the old way still works:

      >>> a = ROOT.std.vector['string']()

Is this a bug or feature?

Not a bug, the Python interpreter correctly complains that it doesn’t know what string means. It’s not a variable name nor a Python type.

ROOT.std.vector[ROOT.std.string] should also work.

Cheers,
Enrico