我在c++17的答案中了解了auto
template parameters的this question。一位同事告知我visual-studio-2017支持它们,但是我尝试使用此功能似乎还不成功。我已经写了这个玩具示例来演示我的问题:
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
模板代码或管理相似的样式,同时仍可以在visual-studio-2017上进行编译?
答案 0 :(得分:3)
auto
非类型模板参数仅在VS 2017版本15.7.0中引入。
旨在将任何类型用作非类型参数的模板现在都可以在模板参数列表中使用
auto
关键字。这样,实例化可以使用任何类型,而无需在实例化时确定并提供模板参数的类型。
在该版本之前,不支持它们。
答案 1 :(得分:2)
此MS help page指出:
如果默认的/ Zc:auto编译器选项有效,则无法使用auto关键字声明方法或模板参数。
因此,您可以关闭/ Zc:auto或可以将此函数作为参数传递:
...
tpl.Reset(ctor);
...