Вывод типа значения массива в шаблоне функции - PullRequest
0 голосов
/ 25 октября 2018

У меня есть следующие опасения по поводу следующего фрагмента кода:

template<std::size_t Dim, std::size_t N,
  typename RangeType1, typename RangeType2>
void multilinear_interp(
  const RangeType1 (&coordsFrom)[Dim],
  const std::array<RangeType2, N>& field)
{
   // do something
}

int main()
{ 
    std::vector<double> x{}, y{};
    std::vector<float> f0{}, f1{};

    multilinear_interp<2, 2>({x, y}, {f0, f1});
}

Похоже, что компилятор может вывести RangeType1, но не может вывести RangeType2, и компиляция не удалась.Есть ли возможность использовать std :: array без явного указания всех параметров шаблона multiliner_interp?Если нет, то что особенного в const T (&) [Dim] относительно std :: array, что его можно вывести в вышеуказанном контексте?

Заранее спасибо.

1 Ответ

0 голосов
/ 25 октября 2018

Да, нет никакого вывода контейнера, подобного std::array из {f0, f1} или даже {{f0, f1}} (если первоначальная мысль - это исключение скобок).Причина в том, что инициализатор в скобках не является выражением.У него нет типа для вывода из .Таким образом, он классифицируется в целом как не выводимый контекст (то есть аргументы шаблона не могут быть выведены из него).

Что касается того, почему он работает в случае обычной ссылки на массив в стиле C, это потому, что исключение являетсясделано явно для них и std::initializer_list параметров.Все это описано в том же стандартном абзаце:

[temp.deduct.call]

1 Вывод аргумента шаблона равенвыполняется путем сравнения каждого типа параметра шаблона функции (назовите его P), который содержит параметров шаблона , участвующих в выводе аргумента шаблона, с типом соответствующего аргумента вызова (назовите его A) какописано ниже.Если удаление ссылок и квалификаторов cv из P дает std​::​initializer_­list<P'> или P'[N] для некоторых P' и N, а аргумент является непустым списком инициализатора ([dcl.init.list]), то вычетвместо этого выполняется для каждого элемента списка инициализатора, принимая P' в качестве типа параметра шаблона функции и элемент инициализатора в качестве аргумента, а в случае P'[N], если N является параметром шаблона нетипичного типа, N выводится из длины списка инициализатора.В противном случае аргумент списка инициализатора приводит к тому, что параметр считается неделедированным контекстом ([temp.deduct.type]).

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