Руководство по частичному выводу C ++ 17 - PullRequest
8 голосов
/ 29 мая 2019

Я пытаюсь написать руководство по выводам, которое обнаруживает только одно из множества typename из заданного аргумента конструктора и требует от пользователя ввода int size вручную

template <int size, typename T>
struct Board
{
            array<array<T, size>, size> values;

            explicit Board(const vector<T>& raw_values){

            }
};
template <int size, typename T> Board(const vector<T>&) -> Board<int size, T>;

Идея выше заключается в том, что пользователь все равно должен быть вынужден ввести аргумент шаблона "int size", а "typename T" должен быть выведен из аргумента конструктора, возможно ли это?

После правильной спецификации метод должен называться

.
auto b = Board<3>(initialStateVector);

В настоящее время мне нужно войти вот так;

auto b = Board<3, int>(initialStateVector);

Итак, я хочу, чтобы "int" выше было выведено из заданного initialStateVector, который имеет тип

const vector<int>& raw_values

1 Ответ

6 голосов
/ 29 мая 2019

Идея, приведенная выше, заключается в том, что пользователь все равно должен быть вынужден ввести аргумент "int size" шаблона, но "typename T" должно быть выведено из аргумента конструктора, возможно ли это?

Согласно примечанию (и последующим примерам) в этой странице cppreference

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

нет, это невозможно (не в C ++ 17; мы можем надеяться на будущие версии стандарта).

Если вы хотите явно указать размер и разрешить вывод типа, лучшее, что я могу себе представить, это пройти через старую добрую функцию make_something.

Я имею в виду следующее (используя std::size_t для размера, как в std::array и почти во всех STL)

template <std::size_t S, typename T>
Board<S, T> make_Board (std::vector<T> const & v)
 { return {v}; }

// ...

auto b = make_Board<3>(initialStateVector);

, который должен работать и в C ++ 11.

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