5

我想使用模板函数确定类型是否为 const,例如:

template <typename TTYPE> bool IsConst(TTYPE) {return false;}

template <typename TTYPE> bool IsConst(const TTYPE) {return true;}

但这不起作用,有什么替代建议吗?

4

2 回答 2

11

您正在寻找的是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

由于您尝试自己制作,因此我建议您查看提供的可能实现以了解这些东西是如何工作的,以防您将来确实需要制作一个。这是一次很好的学习经历。

于 2012-06-02T13:37:12.087 回答
1

考虑以下代码:

#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()我用静态变量更改了函数。它也有效,而且速度更快。

于 2012-06-04T12:24:52.810 回答