在一行中调用is_const<>的版本,但用于变量而不是类型。



嗨,我正在学习c++,我读到了关于is_const等类型特征的文章。is_const可以在一行中调用,比如

cout << is_const<double>::value << endl;

我制作了我自己的is_const版本,但为了测试变量是否为const,它可以像这样使用,

#include<iostream>
using namespace std;
template<typename T>
struct check_const {
check_const(const T *x): val(std::true_type{})
{ }
check_const(T *x) : val(std::false_type{})
{ }
bool val;
};
int main() 
{
const double pi= 3.14;
check_const<double> r(&pi);
cout <<  r.val << endl;    // returns 1
double x= 2.7;
check_const<double> s(&x);
cout << s.val << endl;    // returns 0
return(0);
}

我也想在一行中调用check_const,但编译器一直给我错误,比如

"typename not allowed" 

当我试着把它称为时

cout << check_const<double> t(&pi)::val << endl;

如何更改check_const,以便在一行中调用它?

您只是在这里使用了一个稍微错误的语法:

cout << check_const<double> t(&pi)::val << endl;

而是使用

cout << check_const<double>(&pi).val << endl; 

check_const<double> t(&pi)是命名变量定义的语法,但表达式中不能有声明/定义。

check_const<double>(&pi)是创建未命名临时的语法,可以在表达式中完成。

那么您需要.而不是::,因为valcheck_const的非静态成员。

从C++17开始,你也可以写:

cout << check_const(&pi).val << endl; 

并为您推导模板参数。


所有这些都可以简化,因为您并没有真正使用该类。您可以将构造函数用作免费函数:

template<typename T>
constexpr bool check_const(const T *x) noexcept { return true; }
template<typename T>
constexpr bool check_const(T *x) noexcept { return false; }

(constexpr可以在常量表达式中使用函数,但在其他方面是不需要的。类似地,noexcept只是一个指标,表明函数不会抛出异常,但在其它方面是不必要的。(

这可以更容易地用作

cout << check_const(&pi) << endl;

此外,使用引用代替指针:

template<typename T>
constexpr bool check_const(const T &x) noexcept { return true; }
template<typename T>
constexpr bool check_const(T &x) noexcept { return false; }

你可以写

cout << check_const(pi) << endl;

相关内容

  • 没有找到相关文章

最新更新