# Class BlastTabularSpecSelector
A datatype that can act as either a BlastTabularSpec or as an constexpr integral constant thereof.

Defined in | <seqan/blast.h>
Signature | `template <BlastTabularSpec h> struct BlastTabularSpecSelector { ... };`

## Detailed Description

This is a proxy datatype that enables compile-time optimizations through constexpressions iff the value is known at compile time. You will rarely need to instantiate objects of this type yourself, but they are used in the BlastIOContext.

#### Example

mutable variable:

    BlastTabularSpecSelector<BlastTabularSpec::DYNAMIC> myProgram = BlastTabularSpec::COMMENTS;
    // same as
    // BlastTabularSpec myProgram = BlastTabularSpec::COMMENTS;

    SEQAN_ASSERT(myProgram == BlastTabularSpec::COMMENTS); // assertion is checked at run-time
    myProgram = BlastTabularSpec::NO_COMMENTS; // works without problems

compile time integral constant:

    BlastTabularSpecSelector<BlastTabularSpec::COMMENTS> myProgram;
    static_assert(myProgram == BlastTabularSpec::COMMENTS, ""); // assertion is checked at compile time
    myProgram = BlastTabularSpec::NO_COMMENTS; // would fail, because value is fixed

#### Dox Sources

    /*!
     * @class BlastTabularSpecSelector
     *
     * @headerfile <seqan/blast.h>
     *
     * @brief A datatype that can act as either a @link BlastTabularSpec @endlink or
     *        as an constexpr integral constant thereof.
     *
     * @signature template <BlastTabularSpec h> struct BlastTabularSpecSelector {
     *            ... };
     *
     * This is a proxy datatype that enables compile-time optimizations through
     * constexpressions iff the value is known at compile time. You will rarely need
     * to instantiate objects of this type yourself, but they are used in the @link
     * BlastIOContext @endlink.
     *
     * @subsection Example
     *
     * mutable variable:
     *
     * @code{.cpp}
     * BlastTabularSpecSelector<BlastTabularSpec::DYNAMIC> myProgram = BlastTabularSpec::COMMENTS;
     * // same as
     * // BlastTabularSpec myProgram = BlastTabularSpec::COMMENTS;
     *
     * SEQAN_ASSERT(myProgram == BlastTabularSpec::COMMENTS); // assertion is checked at run-time
     * myProgram = BlastTabularSpec::NO_COMMENTS; // works without problems
     * @endcode
     *
     *
     * compile time integral constant:
     *
     * @code{.cpp}
     * BlastTabularSpecSelector<BlastTabularSpec::COMMENTS> myProgram;
     * static_assert(myProgram == BlastTabularSpec::COMMENTS, ""); // assertion is checked at compile time
     * myProgram = BlastTabularSpec::NO_COMMENTS; // would fail, because value is fixed
     * @endcode
     */