C++17
std::variantfor C++11/14/17
MPark.Variant is an implementation of C++17 std::variant for C++11/14/17.
- Based on my implementation of
std::variantfor libc++ - Continuously tested against libc++'s
std::varianttest suite.
The single-header branch provides a standalone variant.hpp
file for each release.
Copy it and #include away!
You can add mpark/variant as a submodule to your project.
git submodule add https://github.com/mpark/variant.git 3rdparty/variantAdd the include directory to your include path with
-I3rdparty/variant/include then #include the variant.hpp header
with #include <mpark/variant.hpp>.
If you use CMake, you can simply use add_subdirectory(3rdparty/variant):
cmake_minimum_required(VERSION 3.6.3)
project(HelloWorld CXX)
add_subdirectory(3rdparty/variant)
add_executable(hello-world hello_world.cpp)
target_link_libraries(hello-world mpark_variant)git clone https://github.com/mpark/variant.git
mkdir variant/build && cd variant/build
cmake ..
cmake --build . --target installThis will install mpark/variant to the default install-directory for
your platform (/usr/local for Unix, C:\Program Files for Windows).
You can also install at a custom location via the CMAKE_INSTALL_PREFIX
variable, (e.g., cmake .. -DCMAKE_INSTALL_PREFIX=/opt).
The installed mpark/variant can then be found by CMake via find_package:
cmake_minimum_required(VERSION 3.6.3)
project(HelloWorld CXX)
find_package(mpark_variant 1.3.0 REQUIRED)
add_executable(hello-world hello_world.cpp)
target_link_libraries(hello-world mpark_variant)CMake will search for mpark/variant in its default set of
installation prefixes. If mpark/variant is installed in
a custom location via the CMAKE_INSTALL_PREFIX variable,
you'll likely need to use the CMAKE_PREFIX_PATH to specify
the location (e.g., cmake .. -DCMAKE_PREFIX_PATH=/opt).
This library requires a standard conformant C++11 compiler. The following compilers are continously tested:
| Compiler | Operating System | Version String |
|---|---|---|
| GCC 4.8.5 | Ubuntu 16.04.6 LTS | g++-4.8 (Ubuntu 4.8.5-4ubuntu8~16.04.1) 4.8.5 |
| GCC 4.9.4 | Ubuntu 16.04.6 LTS | g++-4.9 (Ubuntu 4.9.4-2ubuntu1~16.04) 4.9.4 |
| GCC 5.5.0 | Ubuntu 16.04.6 LTS | g++-5 (Ubuntu 5.5.0-12ubuntu1~16.04) 5.5.0 20171010 |
| GCC 6.5.0 | Ubuntu 16.04.6 LTS | g++-6 (Ubuntu 6.5.0-2ubuntu1~16.04) 6.5.0 20181026 |
| GCC 7.4.0 | Ubuntu 16.04.6 LTS | g++-7 (Ubuntu 7.4.0-1ubuntu1 |
| GCC 8.3.0 | Ubuntu 16.04.6 LTS | g++-8 (Ubuntu 8.3.0-16ubuntu3~16.04) 8.3.0 |
| GCC 9.2.1 | Ubuntu 16.04.6 LTS | g++-9 (Ubuntu 9.2.1-17ubuntu1~16.04) 9.2.1 20191102 |
| Clang 3.6.2 | Ubuntu 16.04.6 LTS | Ubuntu clang version 3.6.2-3ubuntu2 (tags/RELEASE_362/final) (based on LLVM 3.6.2) |
| Clang 3.7.1 | Ubuntu 16.04.6 LTS | Ubuntu clang version 3.7.1-2ubuntu2 (tags/RELEASE_371/final) (based on LLVM 3.7.1) |
| Clang 3.8.0 | Ubuntu 16.04.6 LTS | clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final) |
| Clang 3.9.1 | Ubuntu 16.04.6 LTS | clang version 3.9.1-4ubuntu3~16.04.2 (tags/RELEASE_391/rc2) |
| Clang 4.0.0 | Ubuntu 16.04.6 LTS | clang version 4.0.0-1ubuntu1~16.04.2 (tags/RELEASE_400/rc1) |
| Clang 5.0.0 | Ubuntu 16.04.6 LTS | clang version 5.0.0-3~16.04.1 (tags/RELEASE_500/final) |
| Clang 6.0.0 | Ubuntu 16.04.6 LTS | clang version 6.0.0-1ubuntu2~16.04.1 (tags/RELEASE_600/final) |
| Clang 7.1.0 | Ubuntu 16.04.6 LTS | clang version 7.1.0-svn353565-1 |
| Clang 8.0.1 | Ubuntu 16.04.6 LTS | clang version 8.0.1-svn369350-1 |
| Clang Xcode 8.3 | Darwin Kernel Version 16.7.0 (OS X 10.12.6) | Apple LLVM version 8.1.0 (clang-802.0.42) |
| Clang Xcode 9.4 | Darwin Kernel Version 17.4.0 (OS X 10.13.3) | Apple LLVM version 9.1.0 (clang-902.0.39.2) |
| Clang Xcode 10.1 | Darwin Kernel Version 17.7.0 (OS X 10.13.6) | Apple LLVM version 10.0.0 (clang-1000.11.45.5) |
| Visual Studio 14 2015 | Visual Studio 2015 with Update 3 | MSVC 19.0.24241.7 |
| Visual Studio 15 2017 | Visual Studio 2017 with Update 8 | MSVC 19.15.26732.1 |
| Visual Studio 15 2017 | Visual Studio 2017 with Update 9 | MSVC 19.16.27025.1 |
| Visual Studio 15 2017 (Clang/LLVM) | Visual Studio 2017 | Clang 7.0.0 |
- GCC 4.8/4.9:
constexprsupport is not available forvisitand relational operators. - Enabling libc++
std::varianttests require-std=c++17support.
-
MPARK_VARIANT_INCLUDE_TESTS:STRING(default:"")Semicolon-separated list of tests to build. Possible values are
mpark, andlibc++.NOTE: The libc++
std::varianttests are built with-std=c++17.
Refer to test/README.md.
Distributed under the Boost Software License, Version 1.0.