【问题标题】:C++ Templates with multiple constraints具有多个约束的 C++ 模板
【发布时间】:2015-06-09 11:41:27
【问题描述】:

在 C# 中,我习惯于在泛型方法或类型中指定多个约束,如下所示:
How do I specify multiple generic type constraints on a single method?

今天我第一次开始使用 C++,当我在谷歌上搜索 模板多个约束 时,我找不到任何有用的东西。
几乎看起来这是不可能的,每个人都知道,因此没有提出任何问题。

我知道在 C# 中泛型通过编译器的验证比在 C++ 中要强得多,这就是为什么不能将我的类型限制为多个超类型对我来说感觉不对的原因。

【问题讨论】:

  • 谷歌static_assert

标签: c++ templates generics constraints


【解决方案1】:

这在今天的 C++ 中是可能的,但语法相当复杂。在下一个主要的 C++ 版本中,我们很可能会获得 concepts 的版本,这会使这变得更加容易。

在 C++14 中,您发布的 C# 示例可能如下所示:

template <class TResponse, class TRequest,
          std::enable_if_t<std::is_base_of<MyClass, TRequest>::value &&
                           std::is_base_of<MyOtherClass, TResponse>::value>* = nullptr>
TResponse Call(TRequest request);

【讨论】:

  • 链接肯定是+1。但是,这将需要相当长的时间来阅读。
  • 如果我们使用 std::enable_if 而不是 std::enable_if_t,它将在 C++11 中可用。
  • @ikh 两者有什么区别?在这些示例中,它们在我看来是一样的
  • @NoelWidmer 没有区别;这只是帮手。 std::enable_if_t&lt;XXXX&gt; * = nullptr 比 typename std::enable_if&lt;XXXX&gt;::type * = nullptr&gt; 短一点。参见:en.cppreference.com/w/cpp/types/enable_if
【解决方案2】:

您通常使用std::enable_if 对 C++ 模板进行约束

这是诀窍 - 如果您的模板如下所示:

template <class T>
<return type> <function name> (args...)

您采用返回类型并将其与enable_if 联合起来,如下所示:

template <class T>
typename std::enable_if<XXX,<return type>>::type
 <function name> (args...)

这里,XXX 代表您的编译时条件。

例如:让 add(T1 t1 , T2 t2) 只为继承自 Addable 的对象编译:

template <class T1, class T2>
 typename std::enable_if<
   std::is_base_of<Addable,T1>::value && std::is_base_of<Addable,T2>::value
 decltype(T1()+T2())>::type
 add (T1 t1, T2 t2){
    return t1+t2;
 }

【讨论】:

  • 是的,这是使用低级语言的缺点,grr。成功了,谢谢:)
  • C++ 就像毒品一样。我们都知道 C# 更容易和更快地开发,我们只是太沉迷于 C++ :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多