The easiest way of porting from SWI-cpp.h to SWI-cpp2.h 
is to change the #include "SWI-cpp.h" to #include 
"SWI-cpp2.h" and look at the warning and error messages. Where 
possible, version 2 keeps old interfaces with a “deprecated” flag 
if there is a better way of doing things with version 2.
For convenience when calling PL_*() functions, the Plx_*() wrapper 
functions add error checking. Also, most of the PL_*() functions that 
work with term_t, atom_t, etc. have 
corresponding methods in PlTerm, PlAtom, etc.
Here is a list of typical changes:
term_t, PlTerm_integer(i),
PlTerm_float(v), or PlTerm_pointer(p).
char* or wchar_t and 
replace them by
std::string or std::wstring if appropriate. 
For example, cout << "Hello " << (char*)A1 << 
endl can be replaced by cout << "Hello " << A1.as_string() 
<< endl. In general, std::string is safer than char* 
because the latter can potentially point to freed memory.
false from a predicate for 
failure, you can do throw PlFail(). This mechanism 
is also used by
PlCheckFail(rc). Note that 
throwing an exception is slower than returning false, so 
performance-critical code should avoid PlCheckFail(rc) 
if failure is expected to happen often.
SWI-Prolog and throw a PlFail 
exception to short-circuit execution and return failure (false) 
to Prolog (or throw a PlException if there was a Prolog 
error.
PlAtom::handle has been replaced by PlAtom::C_, 
which should be accessed by PlAtom::unwrap().
PlTerm::ref has been replaced by PlTerm::C_, 
which should be accessed by PlTerm::unwrap().
PlFunctor::functor has been replaced by PlFunctor::C_, 
which should be accessed by PlFunctor::unwrap().
=
static_cast<char*>(t) is replaced by t.as_string().c_str() 
(and you should prefer t.as_striong();
static_cast<int32_t>(t) is replaced by t.as_int32_t(), 
etc.
int or
long because of problems porting between Unix and Windows 
platforms; instead, use int32_t, int64_t,
uint32_t, uint64_t, etc.