boost::variant或std::variant别名不可编译

目前我的库使用boost::optional和boost::variant。由于C++17已推出,我想添加一个选项,即它可以与boost和std一起工作。

所以我用boost optional and variant和std optional and variant成功测试了完整的代码。

所以我添加了一个类似下面这样的头文件:

#ifdef USE_BOOST
#include <boost/optional.hpp>
#elif USE_STD
#include <optional>
#endif

namespace Foo {

#ifdef USE_BOOST
template <typename T>
using optional = boost::optional<T>
#elif USE_STD
template <typename T>
using optional = std::optional<T>
#endif

}

一切都还能正常工作。

然后我为variant添加了类似的东西

#ifdef USE_BOOST
#include <boost/variant.hpp>
#elif USE_STD
#include <variant>
#endif

namespace Foo {

#ifdef USE_BOOST
template <typename... T>
using variant = boost::variant<T...>
// similar to the following
#elif USE_STD

template <typename...T>
using variant = std::variant<T...>;

template <class T, class... Types>
constexpr T& get(std::variant<Types...>& v) {
    return std::get<T>(v);
};

template <class T, class... Types>
constexpr T&& get(std::variant<Types...>&& v) {
    return std::get<T>(std::move(v));
};

template <class T, class... Types>
constexpr const T& get(const std::variant<Types...>& v) {
    return std::get<T>(v);
};

template <class T, class... Types>
constexpr const T&& get(const std::variant<Types...>&& v) {
    return std::get<T>(std::move(v));
};

#endif

}

在这个库中,我现在到处都在使用Foo::optional和Foo::variant。但是现在所有的函数模板,比如

template <typename... Args>
bool bar(const std::tuple<variant<Args,
                                  std::exception_ptr>...>& args)

已经找不到了。(clang错误消息:没有匹配的函数用于调用...)

测试了clang trunk和VS 2017 15.6.1预览有什么想法吗?

首先要感谢大家!

编辑:在我的gist中有一个最小的例子

转载请注明出处:http://www.sjzxcyzs.com/article/20230401/1656826.html