【发布时间】:2018-11-06 21:29:18
【问题描述】:
我在this question 的回答中了解到c++17'sauto template parameters。一位同事告诉我,他们在 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 将支持 pre-auto 模板参数代码,这需要我将函数类型与函数一起作为模板参数传递:template <typename R, R(*T)(const Foo&)> R bar(const Foo& param) 但这与 auto 模板参数的优雅不匹配。
有没有一种方法可以帮助 Visual Studio 编译 auto 模板代码或在仍然在 visual-studio-2017 上编译的同时管理类似的优雅?
【问题讨论】:
-
我相信,downvoter(s) 不喜欢问题不清楚的事实。是的,从您的示例看来,VS2017 似乎不支持自动模板非类型参数。不,SO 不是 MSVC 帮助台,而且没有能力为您解决这个问题。
-
悲伤...我一直觉得询问特定编译器的解决方法属于“程序员常用的软件工具;并且是软件开发独有的实用、可回答的问题”部分What topics can I ask about here?
-
@Evg
auto是 C++17 的模板参数类型:en.cppreference.com/w/cpp/language/… 我发现它的唯一用途是将函数作为模板参数传递,尽管可能还有其他使用。 -
@JonathanMee:“我一直想询问特定编译器的解决方法”但您并不是在要求“解决方法”。您真的不知道是否需要解决方法。这就是使它成为一个糟糕问题的原因。如果你问,“哎,我用的版本VS2017不支持
auto模板参数,没有它我怎么能达到类似的效果呢?”这将表明您确实对 VS2017 支持和不支持的内容进行了研究。 -
@NicolBolas 首先让我说,我很感激你给了我一些关于如何改进它的方向。我认为你的关键点是:我不知道我是否需要帮助我的编译器或在代码中解决这个问题。这给人的印象是我没有尝试任何事情来找到解决方案。我的问题主要是因为一位同事向我保证 Visual Studio 2017 确实支持
auto模板参数,但我已经独立验证它不支持这一事实。我所做的研究只是查找错误代码并验证我的代码是否在 GCC 上编译。
标签: c++17 visual-studio-2017 visual-studio-2017 c++ templates visual-studio-2017 c++17 auto