扩展两个类的参数的语法
Syntax of a parameter extending two classes
在Java中,可以声明一个参数实现多个接口。你必须使用泛型语法,但你可以:
public <T extends Appendable & Closeable> void spew(T t) {
t.append("Bleah!n");
if (timeToClose())
t.close();
}
在C++中,一种常见的模式是使用只包含纯虚拟函数的类作为接口:
class IAppendable {
public:
virtual void append(const std::string&) = 0;
};
class ICloseable {
public:
virtual void close() = 0;
};
编写一个接受ICloseable
的函数是很琐碎的(这只是多态性):
void closeThis(ICloseable&);
但是,采用参数的函数的签名是什么呢?该参数在Java示例中从ICloseable
和IAppendable
继承而来?
以下是如何仅使用标准设施编写它:
template <class T>
std::enable_if_t<
std::is_base_of<IAppendable, T>{} && std::is_base_of<ICloseable, T>{},
void
> closeThis(T &t) {
t.append("end");
t.close();
}
在Coliru 上直播
如果有更多的基类,我建议制定一个更简洁的类型特征,在enable_if
:中检查它们
constexpr bool allTrue() {
return true;
}
template <class... Bools>
constexpr bool allTrue(bool b1, Bools... bools) {
return b1 && allTrue(bools...);
}
template <class T, class... Bases>
struct all_bases {
static constexpr bool value = allTrue(std::is_base_of<Bases, T>{}...);
constexpr operator bool () const {
return value;
}
};
template <class T>
std::enable_if_t<
all_bases<T, IAppendable, ICloseable>{},
void
> closeThis(T &t) {
t.append("end");
t.close();
}
@Quentin的出色回答促使我编写了一个通用的可变inherits
模板。它允许您轻松地指定任意数量的基类。
#include <type_traits>
template<class... T> struct inherits :
std::true_type
{};
template<class T, class Base1, class... Bases>
struct inherits<T, Base1, Bases...> :
std::conditional_t< std::is_base_of<Base1, T>{},
inherits<T, Bases...>,
std::false_type
>
{};
第一个模板参数是要检查的类型,其余参数是第一个类型必须继承的类型。
例如,
class A {};
class B {};
class C {};
template<class T>
std::enable_if_t<
inherits<T, A, B, C>{},
void
> foo(const T& t)
{
// ...
}
这里,作为参数传递给foo
的任何类型的T
都必须继承自A
、B
和C
。
在Coliru 上直播
相关文章:
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- 将类作为主要参数的语法在哪里需要?
- 初始化对象以在 C++08 中作为参数传递的首选语法是什么?
- 当C++类函数参数之一是结构时,它们的语法有什么不同
- 将显式指定的函数模板重载作为模板参数传递的正确语法是什么?
- 提升::精神::qi::语法和可变参数模板
- C++ 中的默认参数语法和一般语法
- 带有约束的可变参数模板的'requires'表达式的语法是什么?
- C++ C 样式数组作为语法错误的参数
- 使用 MATLAB 语法的 c++ 函数参数?
- 在模板类中的参数包的语法
- 将QMETAMETHOD作为参数传递到使用新的Qobject :: Connect语法的函数
- 在Qt信号和插槽中使用lambda语法并访问传递的参数
- 是否可以在尾随返回类型语法中直接使用参数值(不是其类型,而是值本身)
- 精神语法不会编译:函数模板参数错误?
- 适用于全局模板运算符指定模板参数的适当语法
- hpp文件中的块,这是c ++语法吗?为什么没有传入参数?有人可以解释一下,请
- 有人能解释一下特殊的std::函数模板参数列表语法(这个奇怪的类型(Types..))吗
- 构件和模板参数语法上的指针
- 可变模板模板参数语法