Перечисление в шаблоне Struct - PullRequest
0 голосов
/ 12 марта 2019

Моя проблема такая же, как у этого парня: Ссылка

Это было невозможно тогда и сейчас невозможно, но мой настоящий вопрос таков:

Не было ли в работах для будущих стандартов C ++ (17 и более поздних версий) чего-то такого, что позволило бы это сделать?Я почти на 100% уверен, что прочитал что-то вроде этих строк где-то .

Я мог бы предположить, что это была какая-то оболочка, которая просто возвращала объект шаблона, инициализированный void и затем разрешил перечислению доступ таким образом.

Может ли кто-нибудь указать мне правильное направление?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 12 марта 2019

Это разные типы, я не думаю, что это изменится как никогда.

Подумайте, что произойдет, если существует специализация шаблона, которая изменяет значения перечисления, но не их "имена".

2 голосов
/ 12 марта 2019

Пожалуйста, примите во внимание этот код:

#include <iostream>

template<typename T>
class SomeClass;

template<>
class SomeClass<int>
{
public:
    enum SomeEnum { A=1, B=2 };
};

template<>
class SomeClass<double>
{
public:
    enum SomeEnum { A=4, B=5 };
};


int main()
{
  std::cout << SomeClass<int>::SomeEnum::A << std::endl;
  std::cout << SomeClass<double>::SomeEnum::A << std::endl;
}

(я проверял его на http://cpp.sh/7xc3)

Выходные значения 1 и 4. Как вариант, я мог бы дать один из нихперечислимые значения C и D или, может быть, B и C.

Следовательно, нет однозначной вероятности того, что SomeClass::SomeEnum::A должно быть.Теперь это целочисленные значения, но также учтите, что SomeClass<int>::SomeEnum::A != SomeClass<double>::SomeEnum::A.

Это объяснение того, почему то, что вы просите, может не сработать.Я думаю, вы имеете в виду, что вы пишете шаблонный класс в одной реализации, и в таком случае это не будет двусмысленным.Но это просто общий способ сделать это, а не технический смысл.В конце концов, SomeClass<int> - это другой класс от до SomeClass<double> в целом.Для машины это два совершенно разных класса, таких как SomeClassInt и SomeClassDouble, и, как я показал выше, они могут иметь совершенно разные реализации.

Кроме того, даже если вы в целом заявляете одну реализацию, другуюВ дальнейшем человек мог бы написать специализированную реализацию, которая бы полностью работала с вашим кодом, не переписывая его.Таким образом, существующая единая реализация не будет означать, что в будущем она будет однозначной.Это было бы серьезной проблемой.

Тем не менее, ответ на вопрос в вашей ссылке обеспечивает хороший способ решения проблемы с использованием общего базового класса.Есть ли причина, по которой вы его не используете?

В любом случае, подумайте о значении перечисления здесь в процессе органического мышления ООП.У вас есть пример, где вам это нужно?Давайте поговорим об этом, может быть, проблема XY.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...