是否存在针对Visual Studio缺少对自动模板参数的支持的解决方法?

时间:2018-11-06 21:29:18

标签: c++ templates visual-studio-2017 c++17 auto

我在的答案中了解了auto template parametersthis question。一位同事告知我支持它们,但是我尝试使用此功能似乎还不成功。我已经写了这个玩具示例来演示我的问题:

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);
}

我相信这是不错的代码,works fine on gcc在Visual Studio中却得到了:

  

错误C3533:参数不能具有包含auto

的类型

我确保将“ C ++语言标准”设置为:“ ISO C ++最新草稿标准(/ std:c ++ latest)”,但这似乎并不能解决问题。 Visual Studio将支持auto之前的模板参数代码,该代码要求我将函数类型和函数一起作为模板参数传递:template <typename R, R(*T)(const Foo&)> R bar(const Foo& param)但是,这与auto的优雅风格不符模板参数。

有没有一种方法可以帮助Visual Studio编译auto模板代码或管理相似的样式,同时仍可以在上进行编译?

2 个答案:

答案 0 :(得分:3)

auto非类型模板参数仅在VS 2017版本15.7.0中引入。

  

旨在将任何类型用作非类型参数的模板现在都可以在模板参数列表中使用auto关键字。这样,实例化可以使用任何类型,而无需在实例化时确定并提供模板参数的类型。

在该版本之前,不支持它们。

答案 1 :(得分:2)

MS help page指出:

  

如果默认的/ Zc:auto编译器选项有效,则无法使用auto关键字声明方法或模板参数。

因此,您可以关闭/ Zc:auto或可以将此函数作为参数传递:

...
tpl.Reset(ctor);
...