【问题标题】:Variadic template deduction in variadic template template可变参数模板模板中的可变参数模板推导
【发布时间】:2013-09-14 12:06:08
【问题描述】:

我不确定这个标题是否有意义,但这个例子实际上很简单:

// A converter struct with a generic constructor.
template <template <typename ...> class TT>
struct converter
{
        template <typename ... Args>    
        converter(const TT<Args ...> &);
};

// A few class templates.
template <typename T>
struct foo {};

template <typename T, typename U>
struct foo2 {};

template <typename ... Args>
struct foo_variadic {};

template <typename Arg0, typename ... Args>
struct foo_variadic2 {};

int main()
{
        // All these compile.
        converter<foo>(foo<int>{});
        converter<foo2>(foo2<int,double>{});
        converter<foo_variadic>(foo_variadic<>{});   
        converter<foo_variadic>(foo_variadic<int>{});
        converter<foo_variadic>(foo_variadic<int,double>{});
        // This will not compile.
        // converter<foo_variadic2>(foo_variadic2<int>{});                     
}

我已尝试使用 GCC 4.8.1 和 clang 3.3,错误消息有所不同,但它们都指向在第 5 行附近推断 Args 的一些问题(以及随后从候选列表中排除 converter 构造函数) .

foo_variadic2 相对于其他 foos 有何特殊或不同之处?

(为了记录,我正在尝试实现is_instance_of 类型特征来检测模板类的实例)

更新

现在我的设置中的 GCC 4.8.3 和 4.9.1 都接受这个。 clang 3.4.2 还在叫。

【问题讨论】:

  • 使用 g++ 编译良好,更改一行 'converter(const TT &){}'
  • @DieterLücking 哪个版本的 GCC? (您是否取消了有问题的行的注释,或者您是否意外编译了发布的代码?)
  • 不确定发生了什么。 Here 是另一个我不太了解的案例。哦,就其价值而言,您的示例适用于 VS 2013 RC:P
  • @DanielFrey 哦,删除无法编译的注释
  • 您的示例适用于 GCC 4.9,但不适用于 GCC 4.8 或 clang 3.3。

标签: c++ templates c++11 variadic-templates


【解决方案1】:

这不是解决方案,但可能会帮助您或其他人找出问题所在。以下编译:

template <template <typename ...> class TT>
struct converter2
{
    template <typename Arg0, typename ... Args>    
    converter2(const TT<Arg0, Args ...> &);
};

// ...

converter2<foo_variadic2>(foo_variadic2<int>{});

我不得不承认我不明白为什么这是必要的以及为什么你的代码不起作用。

【讨论】:

  • 感谢您指出这一点!正如你所说,这不是一个通用的解决方案,而是一个很好的临时解决方法。
猜你喜欢
  • 1970-01-01
  • 2020-06-05
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多