Получение неконстантного типа в шаблоне - PullRequest
3 голосов
/ 29 февраля 2012

У меня есть шаблонный класс, который может (и иногда должен) принимать тип const, но есть метод, который возвращает новый экземпляр класса того же типа, но должен быть явно неконстантным.Например, следующий код не может скомпилировать

template<class T> class SomeClass {
public:
    T val;
    SomeClass(T val) : val(val) {}
    SomeClass<T> other() {
        return SomeClass<T>(val);
    }
};

int main() {
    SomeClass<const int> x(5);
    SomeClass<int> y = x.other();
    return 0;
}

, потому что, хотя во время конструктора есть копия val, он копирует в тот же тип - const int.Точно так же, как вы можете различать T и const T в шаблоне, есть ли способ различать T и "nonconst T"?

Ответы [ 3 ]

4 голосов
/ 29 февраля 2012
SomeClass<typename std::remove_const<T>::type> other()
{
    return SomeClass<typename std::remove_const<T>::type>(val);
}

std::remove_const от <type_traits> и является C ++ 11.Вероятно, в Boost.TypeTraits boost::remove_const, или вы можете даже бросить свой собственный.Также возможно использовать std::remove_cv.

4 голосов
/ 29 февраля 2012

Вы можете использовать std::remove_const, если вы используете c ++ 11. В противном случае вы можете использовать это:

struct <typename T>
struct remove_const
{
    typedef T type;
};
struct <typename T>
struct remove_const<const T>
{
    typedef T type;
};

Что делает то же самое.

0 голосов
/ 29 февраля 2012

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

Вы можете использовать / вернуть std::remove_const из type_traits:

#include <type_traits>

template<class T>
class SomeClass {
public:
    T val;
    SomeClass(T p) : val(p) {
    }

    SomeClass<typename std::remove_const<T>::type> other() {
        return static_cast<SomeClass<typename std::remove_const<T>::type> >(val);
    }
};

int main() {
    SomeClass<const int>x(5);
    SomeClass<int>y = x.other();
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...