mirror of https://github.com/swig/swig
124 lines
3.3 KiB
HTML
124 lines
3.3 KiB
HTML
<!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.
|
|
SWIG 4.4.0 added support for forward declarations of such functions.
|
|
</p>
|
|
|
|
|
|
<H2><a name="CPlusPlus14_standard_library_changes">8.3 Standard library changes</a></H2>
|
|
|
|
|
|
</body>
|
|
</html>
|