最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

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

programmeradmin4浏览0评论

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.

发布评论

评论列表(0)

  1. 暂无评论