gpt4 book ai didi

c++ - 完美转发STL容器到模板类

转载 作者:行者123 更新时间:2023-11-30 02:16:06 25 4
gpt4 key购买 nike

尝试使用完美转发将序列容器传递给模板化的类。例如:

template<template<typename T, typename Alloc> class TContainer, class TObject> 
class A {
public:
using ContType = TContainer<TObject, std::allocator<TObject>>;

//This works for R-value references only
explicit A(ContType&& container) : internalContainer(std::forward<ContType>(container)) {};

//This does not work - how might I make it work?
template <typename C>
explicit A(C&& input) : internalContainer(std::forward<C>(input)) {}

private:
ContType internalContainer;
};

我遇到了一个问题,我正在尝试定义一个完美的转发构造函数,但我对如何定义有点迷茫。

我在本网站的其他地方读到,您不能将显式类型参数传递给构造函数。这样做的唯一方法是提供 R 值和 L 值构造函数吗?

最佳答案

确实更简单的是使用多个重载:

template<template<typename T, typename Alloc> class TContainer, class TObject> 
class A {
public:
using ContType = TContainer<TObject, std::allocator<TObject>>;

// for R-value
explicit A(ContType&& container) : internalContainer(std::move(container)) {}

// for L-value
explicit A(const ContType& container) : internalContainer(container) {}

private:
ContType internalContainer;
};

否则您可以使用转发引用并使用 SFINAE 进行保护

template<template<typename T, typename Alloc> class TContainer, class TObject> 
class A {
public:
using ContType = TContainer<TObject, std::allocator<TObject>>;

template <typename T,
std::enable_if_t<
!std::is_same<A, std::decay_t<T>::value // Protect copy constructor
&& std::is_constructible<ContType, T&&>::value>, int> = 0>
explicit A(T&& container) : internalContainer(std::forward<T>(container)) {}

private:
ContType internalContainer;
};

关于c++ - 完美转发STL容器到模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55395630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com