【发布时间】:2014-07-21 12:34:22
【问题描述】:
假设我有一些代码:
void barA() { }
void barB() { }
void fooA() {
// Duplicate code...
barA();
// More duplicate code...
}
void fooB() {
// Duplicate code...
barB();
// More duplicate code...
}
int main() {
fooA();
fooB();
}
我想删除 fooA 和 fooB 之间的重复代码我可以这样做:
struct A { };
struct B { };
template<typename Tag> void bar();
template<> void bar<A>() { }
template<> void bar<B>() { }
template<typename Tag> void foo() {
// Duplicate code
bar<Tag>();
// More duplicate code
}
int main() {
foo<A>();
foo<B>();
}
我引入了两个空的“标签”类来指示要使用哪个bar,并根据标签类模板化foo 和bar。这似乎可以解决问题。问题:
- 这种技术有名字吗?这是“标签调度”的一个例子吗?从我读到的关于Tag dispatching 的内容来看,它略有不同,涉及带有标签参数的函数重载。可能来自 trait 类中的 typedef 的标记。
- 是否有更惯用的编译时技术来实现相同的目标?
编辑:
另一种可能性是使用bar 的函数重载而不是模板特化并将标签类作为参数传递:
struct A { };
struct B { };
void bar(A) { }
void bar(B) { }
template<typename Tag> void foo() {
// Duplicate code
bar(Tag());
// More duplicate code
}
int main() {
foo<A>();
foo<B>();
}
【问题讨论】:
-
我想称之为“标签调度”。
标签: c++ templates c++11 template-meta-programming