c++ - make std::is_default_constructible<Reader>::value like tuple - Stack Overflow

I have class inherited from tuple and try to check default constructor with is_default_constructiblete

I have class inherited from tuple and try to check default constructor with is_default_constructible

template< typename ... Args >
class IdentifierType: public std::tuple< Args... >
{
public:
   IdentifierType( Args... args ) requires( sizeof...( Args ) != 0 ) :std::tuple< Args... >( std::move( args )... )
   {}

   IdentifierType( std::tuple< Args... > tuple ):std::tuple< Args... >( std::move( tuple ) )
   {}

   IdentifierType()
   {}

   IdentifierType( const IdentifierType& ) = default;
   IdentifierType( IdentifierType&& ) = default;
   IdentifierType& operator=( const IdentifierType& other ) = default;
   IdentifierType& operator=( IdentifierType&& other ) = default;

   IdentifierType( std::convertible_to< std::tuple< Args... > > auto&& identifier )
           : std::tuple< Args... >( std::forward< decltype ( identifier ) >( identifier ) )
   {}
};


struct Reader
{
   int mId;
   Reader(int id):mId(id)
   {}
};


int main()
{
   std::cout << "Reader: " << std::is_default_constructible<Reader>::value << std::endl;
   std::cout << "tuple Reader: " << std::is_default_constructible<std::tuple<Reader>>::value << std::endl;
   std::cout << "IdentifierType Reader: " << std::is_default_constructible<IdentifierType<Reader>>::value << std::endl;
}

output

Reader: false
tuple Reader: false
IdentifierType Reader: true

last output line return true, because IdentifierType has default constructor. What needs to be changed to make the function std::is_default_constructible<IdentifierType>::value like in tuple ?

I have class inherited from tuple and try to check default constructor with is_default_constructible

template< typename ... Args >
class IdentifierType: public std::tuple< Args... >
{
public:
   IdentifierType( Args... args ) requires( sizeof...( Args ) != 0 ) :std::tuple< Args... >( std::move( args )... )
   {}

   IdentifierType( std::tuple< Args... > tuple ):std::tuple< Args... >( std::move( tuple ) )
   {}

   IdentifierType()
   {}

   IdentifierType( const IdentifierType& ) = default;
   IdentifierType( IdentifierType&& ) = default;
   IdentifierType& operator=( const IdentifierType& other ) = default;
   IdentifierType& operator=( IdentifierType&& other ) = default;

   IdentifierType( std::convertible_to< std::tuple< Args... > > auto&& identifier )
           : std::tuple< Args... >( std::forward< decltype ( identifier ) >( identifier ) )
   {}
};


struct Reader
{
   int mId;
   Reader(int id):mId(id)
   {}
};


int main()
{
   std::cout << "Reader: " << std::is_default_constructible<Reader>::value << std::endl;
   std::cout << "tuple Reader: " << std::is_default_constructible<std::tuple<Reader>>::value << std::endl;
   std::cout << "IdentifierType Reader: " << std::is_default_constructible<IdentifierType<Reader>>::value << std::endl;
}

output

Reader: false
tuple Reader: false
IdentifierType Reader: true

last output line return true, because IdentifierType has default constructor. What needs to be changed to make the function std::is_default_constructible<IdentifierType>::value like in tuple ?

Share Improve this question edited Mar 10 at 15:04 康桓瑋 43.6k5 gold badges63 silver badges126 bronze badges asked Mar 10 at 14:59 Vladimir ShttlVladimir Shttl 813 bronze badges 2
  • 2 Unrelated, but if all your constructors do is just forwarding arguments to std::tuple constructor, maybe you should inherit tuple's constructors and not write your own? – Yksisarvinen Commented Mar 10 at 15:42
  • The template code for tuple is available in your C++ compiler's standard C++ library headers. – Eljay Commented Mar 10 at 16:17
Add a comment  | 

1 Answer 1

Reset to default 4

You can constrain the default constructor of IdentifierType like:

IdentifierType() requires std::default_initializable<std::tuple<Args...>> 
{};

Or more simply:

IdentifierType() = default;

which also works, since the tuple's default constructor is already constrained.

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1744839661a4596478.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信