gpt4 book ai didi

c++ - 如何确保模板参数是所需类型的子类型?

转载 作者:IT老高 更新时间:2023-10-28 21:38:37 25 4
gpt4 key购买 nike

我有一个模板类,我想做的如下

  1. 确保仅当传递的模板参数是所需类型的子类型时才实例化对象
  2. 预先与代码的用户沟通模板参数必须满足什么

(1) 在某种意义上是自动处理的,如果传递的模板参数不支持类使用代码将无法编译的某些功能。但是这个错误可能会被检测到相当晚。我希望尽快进行检查。我还想要完成的是,很明显,传递的模板参数必须从我提供的基类型派生。

首先,这是被误导了吗?如果不是,我该怎么做? (请用最简单的方法,C++ 对我来说还是个新手)

感谢 stackoverflow,你确实加快了我的 C++ 学习速度。

最佳答案

给定一些完整类型 MyBase,如果 T 不是从 MyBase 派生的,则以下将产生编译时错误:

#include <boost/type_traits/is_base_of.hpp>
#include <boost/static_assert.hpp>

template<typename T>
class Foo {
BOOST_STATIC_ASSERT_MSG(
(boost::is_base_of<MyBase, T>::value),
"T must be a descendant of MyBase"
);
// Foo implementation as normal
};

如果您使用带有 TR1 的 C++03 编译器,则可以使用 std::tr1::is_base_of 代替 boost::is_base_of;如果您使用的是 C++11 编译器,则可以使用 std::is_base_of 代替 boost::is_base_ofstatic_assert 关键字而不是 BOOST_STATIC_ASSERT_MSG 宏:

#include <type_traits>

template<typename T>
class Foo {
static_assert(
std::is_base_of<MyBase, T>::value,
"T must be a descendant of MyBase"
);
// Foo implementation as normal
};

注意这将为私有(private)和模糊派生类型产生 true_type,因此如果您真正需要将 T 视为-a MyBase(在大多数情况下)。

文档链接:
Boost . StaticAssert
Boost . TypeTraits

关于c++ - 如何确保模板参数是所需类型的子类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7020292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com