【问题标题】:How can I enforce that a template parameter used implements some interface in C++?如何强制使用的模板参数在 C++ 中实现某些接口?
【发布时间】:2012-12-06 18:26:20
【问题描述】:

我认为这在 C++ 中是不可能的,我必须有哪些选项来模拟这种行为?

【问题讨论】:

  • 你是指java方式的接口(即继承抽象基类X),还是单纯的说它支持一组操作?
  • 如果您尝试使用该界面,您肯定会注意到它是否缺席。

标签: c++ templates interface


【解决方案1】:

std::is_base_of 用作:

template<typename T>
class A
{
    static_assert(std::is_base_of<IMyInterface, T>::value, 
                  "T must derive from IMyInterface");
};

你也可以在函数模板中做同样的事情。

【讨论】:

    【解决方案2】:

    你可以使用std::is_base_of&lt;YourInterface, YourParameter&gt;,如果结果为false则报错。请记住这是 C++11。

    【讨论】:

      【解决方案3】:

      一些多态接口还是一些静态接口? 后者可以通过Boost Concepts查看。

      【讨论】:

      • IMO 这应该被选为正确答案。如果某人已经有一个可以用 std::is_base_of 检查的接口,那么他就不需要模板参数。允许指定“模板接口”的功能称为“概念”,不,目前 C++ 不支持。它应该是 C++11 的一部分,但没有进入。C++1y 可能会有它。现在你可以使用上面提到的 Boost 概念。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 2010-11-06
      • 2015-05-08
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      相关资源
      最近更新 更多