С ++ можно ли получить доступ к псевдониму (используя) из экземпляра - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть буфер с типом и размером, установленным шаблоном.

Я сохраняю тип с помощью using и разрешаю доступ к размеру с помощью метода.

Все хорошо с размер. Теперь я могу получить доступ к типу (как в строке Buffer<char,6>::value_type val = 'z';), но из экземпляра Buffer?

Я попробовал закомментированный синтаксис, но не смог:

//g++  5.4.0
#include <iostream>
using namespace std;

template<typename T, int N>
struct Buffer {
    using value_type = T;
    constexpr int size() { return N; }
    T tab [N];
    Buffer(T val) { for(int _i; _i<N ; _i++){ tab[_i]=val; } }
    void p(){ for(int _i; _i<N ; _i++){ cout << tab[_i] << " "; } }
};

int main()
{
    Buffer<char,6> b( 'x' );
    cout << "there will be " << b.size() << " values : ";
    b.p();
    cout << endl;
    Buffer<char,6>::value_type  val = 'z';
    // b.value_type val = 'z'; // error: invalid use of ‘using value_type = char’
    // b::value_type val = 'z'; // error: ‘b_c’ is not a class, namespace, or enumeration
    cout << val << endl;
}

1 Ответ

5 голосов
/ 13 февраля 2020

В отличие от stati c членов класса, имена типов должны быть доступны из имени класса, а не имени экземпляра. Не все потеряно, однако, вы можете использовать decltype, чтобы получить имя класса из экземпляра, а затем вы можете получить доступ к имени типа, как

decltype(b)::value_type foo = 'a';
...