【问题标题】:Best way to write a conditionally selectable constructor编写有条件可选构造函数的最佳方法
【发布时间】:2015-03-03 13:59:02
【问题描述】:

我在 C++ 中有以下代码:

struct A;

struct B
{
    B(){}

    template<typename T>
    B(T param){}
};

我希望构造函数模板仅在类型名称 T 可转换为类型 A 时才有效。实现这一目标的最佳方法是什么?

【问题讨论】:

  • 抱歉,我将 C# 和 C++ 混合使用,我同时使用这两种语言,我感到很困惑。我刚刚编辑了问题以修复代码。
  • 请注意,根据我的经验,MSVC2013 对此问题的最佳实践答案存在问题。

标签: c++ c++11 template-meta-programming sfinae


【解决方案1】:

你想启用构造函数ifT可转换A吗?使用std::enable_ifstd::is_convertible

template <
  class T,
  class Sfinae = typename std::enable_if<std::is_convertible<T, A>::value>::type
>
B(T param) {}

这通过应用SFINAE 起作用;如果T 不能转换为A,则替换将失败,并且构造函数将从候选重载集中移除。

【讨论】:

  • 第二个模板参数实际上不需要名称。不过挺好的
  • @BЈовић 我知道,但我通常将这个名称用作一些内联文档。
  • 结合标准的注释14.8.1/7,我觉得你的回答很好。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
相关资源
最近更新 更多