【问题标题】:Is it possible to auto-deduce base class template parameters from constructor?是否可以从构造函数中自动推断基类模板参数?
【发布时间】:2018-06-06 14:55:55
【问题描述】:

此代码示例可以正常工作,并且完全符合它的预期。

template <typename T>
struct base {
    base(T a) {};
};

struct b : public base<int> {
    b() : base(3) {};
};

我想利用 C++17 功能和构造函数中的自动推导模板参数,并执行以下操作:

struct b : public base { // note lack of <int>
    b() : base(3) {};
};

没有一些丑陋的黑客是可能的吗?

【问题讨论】:

  • 你希望b 成为模板吗?
  • 您可以在 C++17 中编写 struct b : public decltype(base(3)),但不会比 struct b : public base&lt;int&gt; 短。

标签: c++ templates c++17


【解决方案1】:

模板参数推导规则不允许。他们不太可能会这样做。考虑一下:

struct b : public base { // note lack of <int>
    b()    : base(3) {}
    b(int) : base(false) {}
};

b 现在的基类是什么?有人可能会争辩说,如果基类的所有初始化都同意类型,这是可行的。但在实践中很难检查这一点(想想 c'tors 所在的单独目标文件),而且似乎 IMO 的功能太小众而没有用处。

因此,总而言之,您无法避免为基类模板指定模板参数。

【讨论】:

  • 继续你的例子;如果您执行auto bar = foo ? "a" : 5 之类的操作,则会出现编译器错误;在这种情况下,我没有看到编译器这样做的问题
  • @UKMonkey - 条件运算符的类型推断规则不需要考虑此功能必须处理的相同开放性。不太一样。
  • @UKMonkey - 另外,这也很脆弱。成员初始化列表中的无害更改可能会破坏构建。而且刚刚发生的事情也不是很清楚。条件运算符的破坏在大多数情况下仍然是本地错误。
  • 我认为更可能发生的是允许函数返回类型这样做。
  • 我并不是要暗示它们是相同的——我的意思是编译器可能只是在你的例子中出错而不试图猜测它应该是什么类型——不要不同意虽然很脆!
猜你喜欢
  • 2016-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
  • 2021-08-13
  • 2019-09-12
  • 1970-01-01
相关资源
最近更新 更多