如何为课堂选择合适的模板

时间:2019-05-27 19:07:15

标签: c++

作为输入,我得到了一个数字,它是变量的位宽。对于前。如果是5,则需要使用char(为8),如果给定14,则需要使用16位int。 我可以自由使用STD lib和C ++ 17之前的所有标准。

我已经创建了类,但是在没有括号的情况下我找不到如何创建实例。我不知道如何在不指定类模板的情况下甚至不作为指针来创建此类对象。

template<typename T>
class Kompresor{
...
};

int main(int agrc, char* argv[]){

    size_t max_value = argv[1];
    size_t copy = max_value + 1;
    int byte_width = 0;
    while(copy > 0){
        copy = copy >> 1;
        ++byte_width;
    }
    // This works
    // Problem is brackets, can't use kompresor outside scope
    if(byte_width < 9){
        Kompresor<char> Kompresor();
    }else if(byte_width < 17){
        Kompresor<int16_t> Kompresor();
    }
    // This dosen't
    Kompresor<>* k;
    k = new Kompresor<char>();

    return 0;
}

我需要在整个程序中使用对象,并且在所有括弧中编写相同的代码只是代码冗余。

2 个答案:

答案 0 :(得分:0)

由于我在编译时不知道大小,所以我求助于 std::vector<uint8_t>,并跟踪向量的大小,谢谢@skeller和其他人。

答案 1 :(得分:0)

创建一个模板函数来完成全部工作,并在main中调度:

template <typename T>
void DoJob()
{
    Kompresor<T> k;
    // ...
}

和主要

int main()
{
    std::size_t size = /*...*/

    switch (size)
    {
        case 8: DoJob<char>(); break;
        case 16: DoJob<std::uint16_t>(); break;
        case 32: DoJob<std::uint32_t>(); break;
        case 64: DoJob<std::uint64_t>(); break;
        default: throw std::runtime_error("unsupported");
    }

}