【发布时间】:2020-01-07 17:35:30
【问题描述】:
我正在尝试编写一个模板函数,该函数将根据其模板参数执行一组dynamic_casts()。我有以下说明:
class FooData
{
public:
virtual ~FooData() {};
};
class DerivedFooData: public FooData{};
class Other: public FooData{};
void bar(DerivedFooData* d1, DerivedFooData* d2) {}
void bar(DerivedFooData* d1, Other*, DerivedFooData* d2, Other*, Other*) {}
int main()
{
DerivedFooData d1,d2;
std::vector<FooData*> container1{&d1, &d2};
std::vector<FooData*> container2{&d1, &d2};
// I want bar to be called with container1[0] cast to DerivedFooData and container2[1] cast to DerivedFooData
// the first two template params are each container size
foo<1, 1, DerivedFooData, DerivedFooData>(container, container2);
// I want bar to be called with
// container1[0] cast to DerivedFooData
// container1[1] cast to Other
// container2[0] cast to DerivedFooData
// container2[1] cast to Other
// container2[2] cast to Other
foo<2, 3, DerivedFooData, Other, DerivedFooData, Other, Other>(container, container2);
}
我可以手动创建其中的一些:
template <int N, int M, typename U, typename V>
void foo(const std::vector<FooData*>& input, const std::vector<FooData*>& output)
{
bar(dynamic_cast<U*>(input[0]), dynamic_cast<V*>(output[0]));
}
template <int N, int M, typename U, typename V, typename W, typename X, typename Y>
void foo(const std::vector<FooData*>& input, const std::vector<FooData*>& output)
{
bar(dynamic_cast<U*>(input[0]), dynamic_cast<V*>(input[1]), dynamic_cast<W*>(output[0]), dynamic_cast<X*>(output[1]), dynamic_cast<Y*>(output[2]));
}
但我不知道如何以通用方式指定N 和M 的所有组合。我认为可变参数模板会出现在某个地方,但我需要一些指导。
【问题讨论】:
-
你能解释一下
N和M参数应该控制什么吗? -
N 和 M 将是第一个和第二个参数向量的大小(在 foo()s 中输入和输出)
-
FWIW,如果您使用的是
dynamic_cast,您通常存在设计缺陷。如果你打算使用它,你真的应该检查返回值以确保它不是nullptr,否则你将面临未定义的行为。 -
如果
N和M是向量的大小,并且必须在编译时知道它们,为什么你使用std::vector而不是std::array? -
@NathanOliver 同意,在演员阵容中,只是试图保持最小的例子很小:-)
标签: c++ c++11 templates variadic-templates template-meta-programming