【发布时间】:2018-01-20 20:52:11
【问题描述】:
目前我的库使用 boost::optional 和 boost::variant。由于 C++17 已经发布,我想添加一个选项,它适用于 boost 和 std。
所以我用 boost optional 和 variant 以及 std optional 和 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
}
一切正常。
然后我为变体添加了类似的东西
#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 Preview 测试 有什么想法吗?
非常感谢!
编辑:一个最小的例子是在我的gist
【问题讨论】:
-
你能提供一个minimal reproducible example吗?
-
Boost 提供的许多设施成为标准的一部分,但大多数在过程中发生了变化,永远不会完全兼容。你必须处理它。
-
std::tuple 已经是 C++11 的一部分,所以从来没有理由从 boost 中使用它。正如我在开头所说的那样,完整的代码可以在没有别名的情况下正常工作。所以当我使用 std::variant 或 boost 变体时。只有别名不编译。
-
添加了小问题。