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();
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();
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);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With