Проверка типов в конструкторе с std::forward

255
27 ноября 2017, 18:59
class A
{
public:
    using number_t = std::int32_t;
    using string_t = std::string;
    template < class T >
    using vector_t = std::vector < T >;
public:
    template < class T1, class T2, class T3 >
    A(T1 && n, T2 && s, T3 && v) :
        m_n { std::forward < T1 > (n) },
        m_s { std::forward < T2 > (s) },
        m_v { std::forward < T3 > (v) } {}
private:
    number_t              m_n;
    string_t              m_s;
    vector_t < number_t > m_v;
};

Вопрос: нужно ли проверять типы T1, T2, T3 в конструкторе? Я так полагаю, что нужно, потому что этот конструктор запросто съедает, например, в качестве первого аргумента double, что нежелательно. Как корректно сделать проверку? Рассматриваю вариант std::enable_if_t и std::is_same. Если так, то как удалять ссылки в случае приема конструктором lvalue-значения? Компилятор ругается на std::is_same < number_t, std::remove_reference< T1 >::type >::value. Пишет: «ожидался тип, а не вот это».

Answer 1

Мне кажется, что в данном случае логично применить std::decay - типа

template<class T1, class T2, class T3,
    typename = enable_if_t<is_same_v<decay_t<T1>,int>>,
    typename = enable_if_t<is_same_v<decay_t<T2>,int>>,
    typename = enable_if_t<is_same_v<decay_t<T3>,int>>
    >
B(T1&& t1, T2&& t2, T3&& t3) :
    a1_{std::forward<T1>(t1)},
    a2_{std::forward<T2>(t2)},
    a3_{std::forward<T3>(t3)}
{
}

Кстати говоря,

typename = enable_if_t<is_same_v<int,remove_reference_t<T1>>>

тоже вполне работает. Причем в определенных ситуациях даже лучше - например, const int decay пропустит, убрав const, а вот remove_reference_t - уже нет, так что если, например, конструктор требует именно ссылку, а не константную ссылку - лучше remove_reference_t, если константную ссылку - лучше decay.

Словом, подгонять по месту с помощью напильника и какой-то матери... :)

READ ALSO
Не виден MessageBox

Не виден MessageBox

В общем, дело такое, есть класс окна, который хорошо себя показывает, обработка внутренних сообщений, отрисовки, ресайза, и тд

314
Вывод объема оперативной памяти

Вывод объема оперативной памяти

Здравствуйте! Есть задание вывести общий объём физической памяти и свободный объём физической памяти в МбИспользую структуру MEMORYSTATUS из библиотеки...

300
синглтон майерса и многопоточность

синглтон майерса и многопоточность

здравствуйте, не раз слышал фразу, что "после c++11 синглтон майерса стал потокобезопасным"

266