【问题标题】:Is There a Workaround for Visual Studio's Lack of Support for auto Template Parameters?Visual Studio 不支持自动模板参数是否有解决方法?
【发布时间】:2018-11-06 21:29:18
【问题描述】:

我在this question 的回答中了解到'sauto template parameters。一位同事告诉我,他们在 上得到支持,但我在尝试使用此功能时似乎不太成功。我编写了这个玩具示例来演示我的问题:

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 &lt;typename R, R(*T)(const Foo&amp;)&gt; R bar(const Foo&amp; param) 但这与 auto 模板参数的优雅不匹配。

有没有一种方法可以帮助 Visual Studio 编译 auto 模板代码或在仍然在 上编译的同时管理类似的优雅?

【问题讨论】:

  • 我相信,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


【解决方案1】:

MS help page 声明:

如果默认的 /Zc:auto 编译器选项有效,则不能使用 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);
}

【讨论】:

  • 这似乎是对 OP 问题的回答,为什么它没有被接受/赞成?
  • @SergeyA OP 可能会生气一会儿;明天接受。
  • @JonathanMee 我认为这种行为不符合 SO 的精神。您已经得到了答案,而且它似乎是一个正确的答案(我无法检查,但它有指向帮助页面的链接,准确地解释了您的情况),但您还没有准备好接受它。
  • @SergeyA 抱歉,生闷气是一个很强烈的词。可能因为 SO 的成员给了我今天生闷气的充分理由而变得更强大。实际上,我从不在发布的同一天接受任何东西。我想给每个人时间来写答案。在这种情况下,我很高兴我确实等了,因为它看起来像 Evg actually wrote a really good answer to my question
  • 我已经提到这是一个非常好的答案。我很惊讶地看到它来自一个名声如此低的人。我只是想劝你坚持下去。 stackoverflow.com 总是可以使用更多优秀的问答者。我查看了您的其他答案,发现:stackoverflow.com/a/52525561/2642059 这是另一个非常好的答案,正是我推荐的答案。它也将成为投票的受害者,这一事实令人沮丧。它现在有我的 +1。继续努力!
【解决方案2】:

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

设计为将任何类型作为非类型参数的模板现在可以在模板参数列表中使用auto 关键字。这允许实例化使用任何类型,而不需要在实例化点确定和提供模板参数的类型。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 2022-01-16
    • 2020-05-07
    相关资源
    最近更新 更多