使用查找表创建类型特征

时间:2018-01-20 19:43:22

标签: c++ enums typetraits

我最近刚接触使用模板作为C ++功能以及C ++ 11-17中最新增加的一些功能。

我正在尝试为枚举类定义一个类型特征,它有一些静态和常量查找表,可以在我的枚举和字符之间进行转换:

枚举类:

// DNA nucleotide symbols.
    enum class DNA : uint8_t {
        Gap, A, C, M, G, R, S, V,
        T, W, Y, H, K, D, B, N, Invalid
    };

type trait:

template<typename T>
    struct conversion_table {};

template<>
    struct conversion_table<DNA> {
        static constexpr DNA from_char[256] = {DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Gap, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::A,
                                               DNA::B, DNA::C, DNA::D,
                                               DNA::Invalid, DNA::Invalid, DNA::G,
                                               DNA::H, DNA::Invalid, DNA::Invalid,
                                               DNA::K, DNA::Invalid, DNA::M,
                                               DNA::N, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::R, DNA::S,
                                               DNA::T, DNA::Invalid, DNA::V,
                                               DNA::W, DNA::Invalid, DNA::Y,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::A, DNA::B,
                                               DNA::C, DNA::D, DNA::Invalid,
                                               DNA::Invalid, DNA::G, DNA::H,
                                               DNA::Invalid, DNA::Invalid, DNA::K,
                                               DNA::Invalid, DNA::M, DNA::N,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::R, DNA::S, DNA::T,
                                               DNA::Invalid, DNA::V, DNA::W,
                                               DNA::Invalid, DNA::Y, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid, DNA::Invalid, DNA::Invalid,
                                               DNA::Invalid};

        static constexpr char to_char[16] = {'-', 'A', 'C', 'M', 'G', 'R', 'S', 'V', 'T', 'W',
                                             'Y', 'H', 'K', 'D', 'B', 'N'};
    };

但据我所知静态使得它为struct的所有实例定义一次,constexpr意味着应该在编译时评估表。

但是,如果我在这样的主函数中使用它:

#import "../biosymbols.h"

int main(){

    auto a = biosymbols::conversion_table<biosymbols::DNA>::from_char['A'];

    return 0;
}

我在编译期间遇到错误:

Undefined symbols for architecture x86_64:
  "biosymbols::conversion_table<biosymbols::DNA>::from_char", referenced from:
      _main in biosymbols_checks.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我不确定为什么,因为这类似于在网络上创建类型特征的示例。有人能指出我需要做些什么来解决这个问题吗?

谢谢!

0 个答案:

没有答案