SeqAn3 3.3.0
The Modern C++ library for sequence analysis.
Loading...
Searching...
No Matches
rna4_implicit_conversion_from_dna4

Normally, we do not allow implicit conversion of single argument constructors, but in this case we make an exception, because seqan3::rna4 and seqan3::dna4 are interchangeable as they behave nearly the same (e.g. same ranks, same char to rank conversion).

int main()
{
using namespace seqan3::literals;
seqan3::rna4 letter1 = 'C'_dna4; // implicitly converted
seqan3::rna4 letter2{};
letter2 = 'C'_dna4; // implicitly converted
}
The four letter RNA alphabet of A,C,G,U..
Definition rna4.hpp:49
Provides seqan3::dna4, container aliases and string literals.
The SeqAn namespace for literals.
Provides seqan3::rna4, container aliases and string literals.


seqan3::sequences (e.g. seqan3::rna4_vector) in general are not implicitly convertible and must be explicitly copied to be converted:

#include <vector>
int main()
{
using namespace seqan3::literals;
seqan3::rna4_vector vector{'A'_dna4, 'C'_dna4, 'G'_dna4}; // (element-wise) implicit conversion
// but this won't work:
// seqan3::rna4_vector rna4_vector{"ACGT"_dna4};
// as a workaround you can use:
// side note: this would also work without the implicit conversion.
seqan3::dna4_vector dna4_vector = "ACGT"_dna4;
seqan3::rna4_vector rna4_vector{dna4_vector.begin(), dna4_vector.end()};
}


You can avoid this copy by using std::ranges::views:

#include <vector>
int main()
{
using namespace seqan3::literals;
seqan3::rna4_vector vector = "ACG"_rna4;
auto dna4_view = vector | seqan3::views::convert<seqan3::dna4>;
for (auto && chr: dna4_view) // converts lazily on-the-fly
{
static_assert(std::same_as<decltype(chr), seqan3::dna4 &&>);
}
}
The four letter DNA alphabet of A,C,G,T..
Definition dna4.hpp:53
Provides seqan3::views::convert.


This conversion constructor only allows converting seqan3::dna4 to seqan3::rna4. Other alphabets that inherit from seqan3::dna4 will not be implicitly convertible to seqan3::rna4.

struct my_rna4 : public seqan3::rna4
{
// using seqan3::rna4::rna4; // uncomment to import implicit conversion shown by letter1
};
struct my_dna4 : public seqan3::dna4
{};
int main()
{
using namespace seqan3::literals;
// my_rna4 letter1 = 'C'_dna4; // NO automatic implicit conversion!
// seqan3::rna4 letter2 = my_dna4{}; // seqan3::rna4 only allows implicit conversion from seqan3::dna4!
}