с++: возвращение типа, а не переменной

137
21 января 2019, 18:00

Подскажите (что-то не могу найти, хотя точно помню, что такая элементарная вещь в C++ была) как вернуть не переменную, а ее тип, который я дальше могу использовать в шаблонах и sizeof()

т.е. что-то типа

class myClass
{
    public:
        struct myData
        {};
        static typedef type() {
            return myData;
        }
}

с использованием

std::vector<myClassObject::type()> data;

P.S.

кстати а почему я не могу объявить константный статический метод?

static typedef type() const;

выдает ошибку

Answer 1

Язык С++ - строго типизированный, так что во время выполнения такое не делается, только во время компиляции. А тут все просто - например,

class myClass
{
    public:
        struct myData
        {};
        using type = myData;
};

vector<myClass::type> data;
myClass object;
vector<decltype(object)::type> obj_data;

Ну, а второй вопрос (кстати, ну не надо разнотипные вопросы в один объединять) - так а к чему ваше const должно относиться? Объекта-то у статической функции нет... Вас же не удивляет, что вы не можете объявить константную функцию, которая не изменяет глобальные переменные? :)

Answer 2

А зачем усложнять?

class myClass
{
    //
public:    
    struct myData {};
    //...
};
std::vector<typename myClass::myData > v;

После того, как вы отправили ссыльку на задачу. Допустим имеем:

struct CDataCompact { ... };
class CDataCompactParser {
   static CDataCompact d;
public:
    static CDataCompact get_data()  { return d; }
    //...
};
CDataCompact  CDataCompactParser::d = CDataCompact();

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

Дальше, если вы обьявляете шаблонный класс с двумя аргументами шаблона, то вы никак не сможете потом инстанцировать с одним аргументом.

template<class IExtractor, class IData>
class CExtractor
{
  //...
};

Другое дело, если вы определите другой шаблонный класс :

template<class T, class V = decltype(T::get_data()) >
class CExtractor_1 {... } ;

Или

template<class T> class
        CExtractor_1 : public CExtractor<T, decltype(T::get_data()) >{};

Тогда вы легко можете использовать CExtractor_1<CDataCompactParser> вмеcто CExtractor<CDataCompactParser, CDataCompact>

READ ALSO
c++ реализация контейнера с итератором для доступа к данным, хранящимся в файле

c++ реализация контейнера с итератором для доступа к данным, хранящимся в файле

Поскольку когда мучаю читателей этого сайта мелкими задачами и часто возникает вопрос "зачем", то решил описать сразу и большую задачу, с которой...

152
Помогите составить код с операторами switch,break,goto

Помогите составить код с операторами switch,break,goto

Сейчас делаю задачу из интернета,основная цель используя оператор switch, составить программу для получения таблицы значений функции У для...

172
Вывод имени USB-девайса

Вывод имени USB-девайса

Пытаюсь вывести имя нового USB-девайса, когда его подключаютПроблема в том, что при вставке флешки messagebox появляется, но на нем ничего нет

184