Идеальная пересылка контейнера STL в класс шаблона - PullRequest
1 голос
/ 28 марта 2019

Попытка использовать совершенную пересылку для передачи контейнера последовательности в класс, который является шаблонным. Например:

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-значения?

1 Ответ

3 голосов
/ 28 марта 2019

На самом деле проще использовать несколько перегрузок:

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;
};
...