目前,我的库使用boost::optional和boost::variant。由于C++ 17已发布,因此我想添加一个选项,使其与boost和std一起使用。
因此,我测试了带有boost可选和variant以及std可选和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)
找不到了。 (c语错误消息:没有匹配的函数可以调用...)
已通过clang trunk和VS 2017 15.6.1 Preview测试
任何的想法?
提前谢谢了!
编辑:一个最小的例子是在我的gist
最佳答案
终于问题解决了。这是在VS中lang的错误。 GCC可以编译。 clang和VS的解决方案是使用显式模板参数调用该函数。
关于c++ - 混淆boost::variant或std::variant无法编译,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48360986/