模板元编程编译时分支
模板元编程
C++中,常使用模板函数、模板类进行编程,实现代码的泛化。
但在开发时,常常遇到一些问题,例如以下代码:
class A
{
public:
int function(){...}
}
template <typename T>
bool isClassA(T aData)
{
return false;
}
template <>
bool isClassA(A aData)
{
retun true;
}
template <typename T>
int function1(T aData)
{
if(isClassA(aData))
{
return aData.function();
}
else
{
return 1;
}
}
int main(int argc, char **argv)
{
int i;
A a;
function1(1);
function1(a);
return 0;
}
以上代码在编译时会提示,int类型没有function名的成员函数。
尽管开发者知道,函数 function1 对于A 和其他类的处理方式是不同的,但是编译器仍然会对不同类型都进行两个分支的可行性检查,因此在检测后,会提示错误。
那么如何避免这种错误呢?
if constexpr
应用C++14中引出的if constexpr,可以解决这一问题,话不多说,直接上代码
class A
{
public:
int function(){...}
}
template <typename T>
inline constexpr bool isClassA(T aData)
{
return false;
}
template <>
inline constexpr bool isClassA(A aData)
{
retun true;
}
template <typename T>
int function1(T aData)
{
if constepr(isClassA(aData))
{
return aData.function();
}
else
{
return 1;
}
}
int main(int argc, char **argv)
{
int i;
A a;
function1(1);
function1(a);
return 0;
}
上述代码,使用C++14可以正常编译、运行,遗憾的是,目前还没了解到最广泛使用的C++11有解决此问题的方法,如果有解决此问题的其他方法,欢迎大家在评论区补充。