Есть ли обходной путь для отсутствия поддержки Visual Studio для автоматических параметров шаблона? - PullRequest
0 голосов
/ 07 ноября 2018

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

struct Foo {
  int mem;
};

template <auto T>
decltype(T(Foo{})) bar(const Foo& param)
{
  return T(param);
}

int func(const Foo& param) { return param.mem; }

int main() {
  Foo myFoo{ 13 };

  cout << bar<&func>(myFoo);
}

Я считаю, что это хороший код, так как он отлично работает на gcc В Visual Studio, однако я получаю следующее:

ошибка C3533: параметр не может иметь тип, который содержит auto

Я гарантировал, что мой "Стандарт языка C ++" установлен на: "Последний проект стандарта ISO C ++ (/ std: c ++ последний)", но это, похоже, не решает проблему. Visual Studio будет поддерживать код параметра шаблона до auto, который требует, чтобы я передавал тип функции вместе с функцией в качестве аргументов шаблона: template <typename R, R(*T)(const Foo&)> R bar(const Foo& param) Но это не соответствует элегантности параметра шаблона auto.

Можно ли как-нибудь помочь Visual Studio скомпилировать код шаблона auto или управлять аналогичной элегантностью, все еще компилируя на ?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

auto нетипичные параметры шаблона были введены только в версии VS 2017 15.7.0 .

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

До этой версии они не поддерживаются.

0 голосов
/ 07 ноября 2018

Эта Страница справки MS сообщает:

Параметр метода или шаблона не может быть объявлен с ключевым словом auto, если включена опция компилятора по умолчанию / Zc: auto.

Таким образом, вы либо выключаете / Zc: auto, либо можете передать эту функцию в качестве параметра:

#include <iostream>

struct Foo {
    int mem;
};

int func(const Foo& param) {
    return param.mem;
}

template <class Func>
auto bar(const Foo& param, Func&& f) {
    return f(param);
}

int main() {
    Foo f { 42 }; 
    std::cout << bar(f, func);
}
...