如何检查模板参数是否为 std::variant?
How to check if template argument is std::variant?
我想编写自己的容器MyContainer
。它实现了一个 emplace 方法来就地构造对象。
template<typename T>
MyContainer<T>::emplace(Args ... args)
{
// Some construction code ....
*_cursor = T(args...);
_cursor++;
return *item;
}
不过,我想始终返回Allocator
类型。尽管如果模板参数T
的类型为std::variant
,这将成为问题。我想做一个 SFINAE,选择适合std::variant
的过载。
template<typename T>
template<typename Allocator, typename ... Args>
Allocator&
MyContainer<T>::emplace(Args ... args)
{
// Some construction code ....
*_cursor = T(Allocator(args...)); // T is std::variant, Allocator is one variant of T.
T* item = _cursor;
_cursor++;
return std::get<Allocator>(*item); // Here I want to return the correct variant
}
(我知道编译器可以根据我是否提供Allocator
模板参数来选择重载。但是我想创建我的容器,以便为特定类型的子类型以及 std::variant/union 类型提供一个 emplace 方法。所以我不是在寻找那些答案)。
这是使用专用化来解开模板类型的一个相当基本的情况:
#include <variant>
#include <type_traits>
#include <iostream>
#include <string>
template<typename T> struct is_variant : std::false_type {};
template<typename ...Args>
struct is_variant<std::variant<Args...>> : std::true_type {};
template<typename T>
inline constexpr bool is_variant_v=is_variant<T>::value;
int main()
{
std::cout << is_variant_v<int> << std::endl;
std::cout << is_variant_v<std::string> << std::endl;
std::cout << is_variant_v<std::variant<int, double>> << std::endl;
return 0;
}
这是你的基本蓝图。在模板中,您可以使用它,也许在if constexpr
中执行适当的逻辑。或者将其用作更复杂的专业化的构建块。
相关文章:
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 关于std::move的使用,是否有编译警告
- 通过网络、跨平台传递std::变体是否安全
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- std::vector::迭代器是否可以合法地作为指针
- MESI协议和std::atomic-它是否确保所有写入立即对其他线程可见?
- 是否将std::packaged_task添加到现有线程
- C++中是否存在 std::conditional 的懒惰等价物?
- 检查某些类型是否是模板类 std::optional 的实例化
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- C++标准是否允许<double>在没有开销的情况下实现 std::可选
- '[](std::list& list)<int>{return std::move(list)}(list)' 是否保证将 'list' 留空?
- "std::list::splice(std::const_iterator pos, std::list&& other)"是否保证将"其他"留空?
- 为什么程序员同时使用 std::bad_alloc 和 std::exception.是否 std::例外 仅是不够的
- glibcxx STL 在实现 std::valarray::sum() 时是否不正确?
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- std::p romise::set_value() 和 std::future::wait() 是否提供内存围栏?
- std::less是否应该允许在编译时比较不相关的指针?