如何解决如果参数包右侧包含简单类型参数,为什么可变参数模板参数包保持相同的大小?
为了在可变参数模板中找到类型的位置,我实现了以下模板:
template <class T,class ...Params,class Based>
size_t derived_index(Based* a) {
// show template instance and size of Params
std::cout << __PRETTY_FUNCTION__ << std::endl;
std::cout << sizeof...(Params) << std::endl;
// verify is a is one of the polymorphic types
if (dynamic_cast<T*>(a) != nullptr)
return 0;
else
return 1u + derived_index<Params...,Based>(a);
}
以这种方式可以推导出Based
模板参数,例如:
struct Base { virtual void f() = 0; };
struct A: Base { void f() override {} };
struct B: Base { void f() override {} };
struct C: Base { void f() override {} };
struct D: Base { void f() override {} };
int main() {
Base* a = new A;
Base* c = new C;
std::cout << " index: " << derived_index<A,B,D>(c) << std::endl;
return 0;
}
我做了另一个看起来更好的实现,因为它检测是否找不到并返回-1,所以我需要重载derived_index
:
UPDATED VERSION 这个可以很好地推断出基于类型。
template <class Based>
int derived_index(Based* a) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
return -1;
}
template <class T,class Based>
int derived_index(Based* a) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
if (dynamic_cast<T*>(a) != nullptr)
return 0;
else {
auto&& index = derived_index<Params...>(a);
return index >= 0 ? 1 + index: -1;
}
}
在第一个版本 Params
大小保持不变,有人知道这是什么原因吗?标准吗?
谢谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。