| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
| <html> |
| <head> |
| <title>SWIG and C++14</title> |
| <link rel="stylesheet" type="text/css" href="style.css"> |
| <meta http-equiv="content-type" content="text/html; charset=UTF-8"> |
| </head> |
| |
| <body bgcolor="#ffffff"> |
| <H1><a name="CPlusPlus14">8 SWIG and C++14</a></H1> |
| <!-- INDEX --> |
| <div class="sectiontoc"> |
| <ul> |
| <li><a href="#CPlusPlus14_introduction">Introduction</a> |
| <li><a href="#CPlusPlus14_core_language_changes">Core language changes</a> |
| <ul> |
| <li><a href="#CPlusPlus14_binary_literals">Binary integer literals</a> |
| <li><a href="#CPlusPlus14_return_type_deduction">Return type deduction</a> |
| </ul> |
| <li><a href="#CPlusPlus14_standard_library_changes">Standard library changes</a> |
| </ul> |
| </div> |
| <!-- INDEX --> |
| |
| |
| |
| <H2><a name="CPlusPlus14_introduction">8.1 Introduction</a></H2> |
| |
| |
| <p>This chapter gives you a brief overview about the SWIG |
| implementation of the C++14 standard. |
| There isn't much in C++14 that affects SWIG, however, work has only just begun on adding |
| C++14 support. |
| </p> |
| |
| <p> |
| <b>Compatibility note:</b> SWIG-4.0.0 is the first version to support any C++14 features. |
| </p> |
| |
| <H2><a name="CPlusPlus14_core_language_changes">8.2 Core language changes</a></H2> |
| |
| |
| <H3><a name="CPlusPlus14_binary_literals">8.2.1 Binary integer literals</a></H3> |
| |
| |
| <p> |
| C++14 added binary integer literals and SWIG supports these. |
| Example: |
| </p> |
| |
| <div class="code"> |
| <pre> |
| int b = 0b101011; |
| </pre> |
| </div> |
| |
| <H3><a name="CPlusPlus14_return_type_deduction">8.2.2 Return type deduction</a></H3> |
| |
| |
| <p> |
| C++14 added the ability to specify <tt>auto</tt> for the return type of a function |
| and have the compiler deduce it from the body of the function (in C++11 you had |
| to explicitly specify a trailing return type if you used <tt>auto</tt> for the |
| return type). |
| </p> |
| |
| <p> |
| SWIG parses these types of functions, but with one significant limitation: SWIG |
| can't actually deduce the return type! If you want to wrap such a function |
| you will need to tell SWIG the return type explicitly. |
| </p> |
| |
| <p> |
| The trick for specifying the return type is to use <tt>%ignore</tt> to tell |
| SWIG to ignore the function with the deduced return type, but first provide |
| SWIG with an alternative declaration of the function with an explicit return |
| type. The generated wrapper will wrap this alternative declaration, and the |
| call in the wrapper to the function will call the actual declaration. Here is |
| an actual example: |
| </p> |
| |
| <div class="code"><pre> |
| std::tuple<int, int> va_static_cast(); |
| %ignore va_static_cast(); |
| #pragma SWIG nowarn=SWIGWARN_CPP14_AUTO |
| |
| %inline %{ |
| #include <tuple> |
| |
| auto va_static_cast() { |
| return std::make_tuple(0, 0); |
| } |
| %} |
| </pre></div> |
| |
| <p> |
| For member methods the trick is to use <tt>%extend</tt> to redeclare the method and call it as follows: |
| </p> |
| |
| <div class="code"><pre> |
| %extend X { |
| const char * a() const { return $self->a(); } |
| } |
| %inline %{ |
| struct X { |
| auto a() const { |
| return "a string"; |
| } |
| }; |
| %} |
| </pre></div> |
| |
| <p> |
| <b>Compatibility note:</b> SWIG-4.2.0 first introduced support for functions declared with an auto return without a trailing return type. |
| </p> |
| |
| |
| <H2><a name="CPlusPlus14_standard_library_changes">8.3 Standard library changes</a></H2> |
| |
| |
| </body> |
| </html> |