当前位置: 首页 > 知识库问答 >
问题:

如何在Visual Studio 2017中支持变量模板类型

裴兴学
2023-03-14

T.C.在这里给出了一个巧妙的解决方案,它使用了这个对象:

template<class... Ts> struct overload : Ts... { using Ts::operator()...; };
template<class... Ts> overload(Ts...) -> overload<Ts...>;
struct fallback_t { template<class T> fallback_t(T&&) {} };

不幸的是,我无法在Visual Studio 2017中编译它。我得到的错误:

1个

我能做些什么使VisualStudio尊重中的可变模板吗?

共有3个答案

巩才捷
2023-03-14

正如@S.M.所指出的,您可以尝试使用/std::c17在c17模式下编译;请注意,一些C17特性可能会破坏现有代码。此外,正如@milesbudnek所指出的,截至今天,MSVC不支持所需的功能。

如果你不能使用C17模式,你可以在C14中实现这一点。

我要做一些改变:

template <class... Fs>
struct overload_t;

// zero
template<>
struct overload_t<> {};

// >1
template <class F0, class... Frest>
struct overload_t<F0, Frest...> :
  F0,
  overload_t<Frest...>
{
    overload_t(F0 f0, Frest... rest) :
      F0(std::move(f0)), overload_t<Frest...>(std::move(rest)...)
   {}

    using F0::operator();
    using overload_t<Frest...>::operator();
};

// 1
template <class F0>
struct overload_t<F0> : F0
{
    overload_t(F0 f0) : F0(std::move(f0)) {}

    using F0::operator();
};

template <class... Fs>
auto overload(Fs... fs)
{
  return overload_t<Fs...>(std::move(fs)...);
}
东方俊明
2023-03-14

这取决于三个独立的C 17功能:

  • 变量使用声明(支持包扩展)

第一个C 17之前版本的常见解决方法是递归继承(为了简单起见,省略了转发):

template<class T, class... Ts> 
struct overload : T, overload<Ts...> {
    using T::operator();
    using overload<Ts...>::operator();
    overload(T t, Ts... ts) : T(t), overload<Ts...>(ts...) {}
};

template<class T> 
struct overload<T> : T {
    using T::operator();
    overload(T t) : T(t) {}
};

template<class...Ts> 
overload<Ts...> make_overload(Ts... ts) {
    return overload<Ts...>(ts...); 
}

如果编译器不支持基类的聚合,则需要构造函数;如果编译器不支持类模板的模板参数推断,则需要使用make_重载。

暨弘毅
2023-03-14

它只在C17中有效。尝试编译它在Visual Studio 2017与标志/std: c 17下的项目-

 类似资料:
  • 变量通用属性 变量通用属性有title,value,type,tip,rule,message,除了通用属性个别变量还有其它属性,请看每个具体控件; "vars": { "varName1": { "title": "测试 text", /*后台设置时 input 的 label*/ "value": "1", /*变量默认值*/ "type

  • 变量通用属性 变量通用属性有title,value,type,tip,rule,message,除了通用属性个别变量还有其它属性,请看每个具体控件; "vars": { "varName1": { "title": "测试 text", /*后台设置时 input 的 label*/ "value": "1", /*变量默认值*/ "type

  • 问题内容: 我有以下模板: 并最终以: 有办法吗? 问题答案: 更新资料 我们可以像这样创建指令并调用它 ng-var.directive.ts 通过此指令,我们可以使用以下命令 要么 要么 要么 原始答案 角v4 1)+ + 2)+ + 视图 component.ts 3)如果您不想创建包装器,可以使用 视图 正如@基思在评论中提到的 这在大多数情况下都可以使用,但这不是通用解决方案,因为它依赖

  • 我试图在变量函数模板上使用'decltype'来获取其返回值类型,然后使用它来定义成员变量。但我一直在犯这样的错误: 基本上,decltype失败并将声明为int,而不是推断的返回类型。 它的工作原理是当我提供的所有参数的值,但这不是我要找的行为。因为我不知道该函数有多少参数,所以它必须保持为可变模板函数。 我计划如何使用类模板的示例: 如果我没有任何成员变量,并使用作为: 它编译,因此我相信能够

  • 我试图用成员模板函数实现一个可变类模板,其模板参数独立于类模板参数,但在定义成员模板时遇到了问题。 我将问题简化为尝试编译此文件(抱歉,无法进一步简化): 在尝试编译(C 11)时,我遇到以下错误: 我很确定它归结为第一个和第五个错误,但不知道我做错了什么。为什么

  • 正如我们已经描述过的,模板可以使用在数据模型中定义的变量。 在数据模型之外,模板本身也可以定义变量来使用。 这些临时变量可以使用FTL指令来创建和替换。请注意每一次的 模板执行 工作都维护它自己的私有变量, 同时来渲染页面。变量的初始值是空,当模板执行工作结束这些变量便被销毁了。 可以访问一个在模板里定义的变量,就像是访问数据模型根root上的变量一样。 这个变量比定义在数据模型中的同名参数有更高