我想使用模板函数确定类型是否为 const,例如:
template <typename TTYPE> bool IsConst(TTYPE) {return false;}
template <typename TTYPE> bool IsConst(const TTYPE) {return true;}
但这不起作用,有什么替代建议吗?
您正在寻找的是std::is_const
. 如果您给它的类型是 const,value
则将是true
. 如果没有,value
将是false
。
这是您可以在该页面上找到的示例:
#include <iostream>
#include <type_traits> //needed for is_const
int main()
{
std::cout << boolalpha; //display true/false, not 1/0
std::cout << std::is_const<int>::value << '\n'; //int isn't const
std::cout << std::is_const<const int>::value << '\n'; //const int is const
}
输出:
false
true
由于您尝试自己制作,因此我建议您查看提供的可能实现以了解这些东西是如何工作的,以防您将来确实需要制作一个。这是一次很好的学习经历。
考虑以下代码:
#include <iostream>
template<typename T>
struct isConst
{
static bool result;
};
template<typename T>
struct isConst<const T>
{
static bool result;
};
template<typename T>
bool isConst<T>::result = false;
template<typename T>
bool isConst<const T>::result = true;
int main()
{
std::cout << std::boolalpha;
std::cout << isConst<int>::result << "\n";
std::cout << isConst<const int>::result << "\n";
std::cout << isConst<const char>::result << "\n";
std::cout << isConst<char*>::result << "\n";
std::cout << isConst<const float>::result << "\n";
return 0;
}
我用模板专业化解决了你的问题。何时自动T
调用const
专用(第二)版本。如果您编译并运行此代码,您将获得:
false
true
true
false
true
您的版本不起作用,因为您重新定义了IsConst
函数(它被禁止并导致编译器错误)
注意:result()
我用静态变量更改了函数。它也有效,而且速度更快。