Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to use C++11 integral_constant::value_type()

Tags:

c++11

I am learning to use C++ 11 type_traits, in integral_constant, there is a function value_type();

I tried this but got error:

typedef std::integral_constant<int, 1> one_t;
one_t one_o;
one_o.value_type();

../src/main.cc:13:9: error: cannot refer to type member 'value_type' in 'one_t' (aka 'integral_constant') with '.'
one_o.value_type();

like image 761
Dean Chen Avatar asked Oct 15 '25 10:10

Dean Chen


2 Answers

Well the function value_type() is not really a function with that name. Indeed, the definition of integral_constant looks like this:

template <class T, T v>
struct integral_constant {
    // ...
    typedef T value_type;
    constexpr operator value_type() const noexcept { return value; }
};

Notice that value_type is actually a typedef for the template parameter T (int, in OP's example). In addition there's a conversion operator that converts from integral_constant<T, v> to T. It's implicitly called like this

int i = one_o; // same as int i = 1;

To call it explicitly you need to use the operator keyword and the right type like this:

one_o.operator int();

which, thanks to the typedef member, is also equivalent to

one_o.operator one_t::value_type();
like image 102
Cassio Neri Avatar answered Oct 19 '25 09:10

Cassio Neri


If you want to create a temporary object of type int, then you should write like this.

typedef std::integral_constant<int, 1> one_t;
one_t one_o;
one_t::value_type();

If you meant operator value_type(), which is a conversion operator, then do it like this.

typedef std::integral_constant<int, 1> one_t;
one_t one_o;
int something = static_cast<value_type>(one_o);
like image 32
Inbae Jeong Avatar answered Oct 19 '25 09:10

Inbae Jeong



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!