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 |1 Answer
Reset to default 4You 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
std::tuple
constructor, maybe you should inherit tuple's constructors and not write your own? – Yksisarvinen Commented Mar 10 at 15:42