C++:如何对模板函数进行分支
C++: How to branch a template function?
我想做这样的事情...
class A;
class B;
class C;
void a(A);
void b(B);
void c(C);
template<typename T> void f(T t)
{
if (some condition)
a(t)
else if (some other condition)
b(t)
else
c(t);
}
int main()
{
A myA;
B myB;
C myC;
f(myA); // some condition ensures f(myA) only calls a(myA)
f(myB); // some condition ensures f(myB) only calls b(myB)
f(myC); // some condition ensures f(myC) only calls c(myC)
return 0;
}
但这不能编译,因为没有定义
a(B),a(C),b(A),b(C),c(A),c(B)。有没有办法解决这个问题? 我试图看看 std::function() 或 std::bind() 是否可以用来动态构造对 a()、b() 或 c() 的调用,但没有运气。
不要使用模板。使用重载:
void f(A x) { if (some_condition) a(x); }
void f(B x) { if (another_condition) b(x); }
void f(C x) { if (third_condition) c(x); }
如果条件已在调用站点确定,请将其从f
中删除,而是将对象保留在本地:
int main()
{
if (some_condition)
{
A myA;
f(myA);
}
else { /* ... */ }
}
您是否正在寻找模板专业化?
template<typename T> void f(T t)
{
// Generic implementation
}
// Specialization for A
template<> void f(A a)
{
// A-specific behavior
}
// Repeat for B and C etc.
是的,重载函数(如上所述是要走的路)
但是,如果您必须进行分支并控制 a,b,c 的 impl,则可以将 a()、b() 和 c() 声明为模板函数
template<class X>
void a(X aVar){ // impl of a(A); }
template<class X>
void b(X bVar){ // impl of b(B); }
template<class X>
void c(X cVar){ // impl of c(C); }
相关文章:
- 如果以下行不包含决策或分支,GDB 无法单步跳过函数
- 函数指针与条件分支
- 是否可以使用函数指针数组来删除分支
- Clang++ 6.0 内存清理器未报告返回值指示条件分支的函数中的未初始化局部变量
- 是否有任何内置函数可以告诉编译器分支是否可预测
- 有没有办法避免此函数中的分支/条件逻辑?
- GCC/GCOV 为 使用 throw() / noexexcept 函数生成的不同分支覆盖
- 如何组合if(),以便将函数称为一次避免分支失误
- 运行时函数在编译时函数上分支
- C++:如何对模板函数进行分支
- 为什么预分配的函数指针的性能比分支差
- 在 C++ 中编写多个 if-else 语句并使用 rand() 函数进行分支
- 函数返回在“if”的分支中,与“if”的分支,在C++
- 避免基于作为模板参数的函数的返回值进行分支
- 函数指针上的分支预测
- 函数参数内的If语句;分支类型
- 模板函数分支优化
- 用分支开始一个函数
- 分支函数中的模板参数
- gcov报告的析构函数中的分支是什么?