简化:
bool
,具有相同的基类,不带参数)最佳答案
template<class T, class...Ms>
void run_all(T* t, Ms&&... ms) {
using discard=int[];
(void)discard{0,(void(
(t->*ms)()
),0)...};
}
使用:
struct foo {
bool t1() { return true; }
bool t2() const { return false; }
};
int main() {
foo f;
run_all(&f, &foo::t1, &foo::t2);
}
run_all
有点钝,但这是因为我们没有C++ 17。template<class T, class...Ms>
void run_all(T* t, Ms&&... ms) {
((void)((t->*ms)()),...);
}
这比较简单,甚至:
template<class T, class...Ms>
void run_all(T* t, Ms&&... ms) {
((t->*ms)(),...);
}
它依赖
t->*ms
返回理智的类型。我们还可以依靠
ms
返回bool并执行以下操作:template<class T, class...Ms>
void run_all(T* t, Ms&&... ms) {
(void)std::initializer_list<bool>{(t->*ms)()...};
}
要么
template<class T, class...Ms>
void run_all(T* t, Ms&&... ms) {
using discard=bool[];
(void)discard{false,(t->*ms)()...};
}
请注意,所有这些命令均按顺序执行其方法,并支持传递0个方法。
上面的
void
强制转换中的某些内容用于阻止未使用值的警告。还有其他方法可以解决调用返回超载
operator,
的类型的可能性。