使用type和integer作为模板参数

时间:2016-05-16 12:19:21

标签: c++ templates singleton c++14

对于我正在处理的代码,我有一个使用“context”单例的类。为了使编码器更友好,我将用作模板的Singleton类传递给对象。例如,像这样:

#include <iostream>

class DefaultCtx {
private:
    DefaultCtx() {};
    const char *str = "default";
public:
    static const char* get()
    {
        static DefaultCtx instance;
        return instance.str;
    }
    DefaultCtx(DefaultCtx const &) = delete;
    void operator=(DefaultCtx const &) = delete;
};  

// Context for 64bits.    
class Ctx64 {
private:
    Ctx64() {};
    const char *str = "64";
public:
    static const char* get()
    {
        static Ctx64 instance;
        return instance.str;
    }
    Ctx64(Ctx64 const &) = delete;
    void operator=(Ctx64 const &) = delete;
};  

template<typename Ctx>
class UsesCtx {
public:
    UsesCtx() { std::cout << "Constructed using singleton " << Ctx::get() << std::endl; }
};  

这个方案运行正常,我很满意在构造对象时需要将上下文作为模板参数传递。但是,由于Ctx64用于64位表示,我想添加一点语法糖并使用UsesCtx<64>

int main() {
    UsesCtx<DefaultCtx> a;
    UsesCtx<Ctx64> b;

    // UsesCtx<64> c; //< I don't know how to achieve that.

}

正如我在此所述,我不知道如何实现它。我试图用整数模板重新定义类,但这给了我以下错误(使用g++ example.cpp --std=c++14编译)

// Gives compile error "error: template parameter ‘class Ctx’ redeclared here as ‘int n’"
template<int n>
class UsesCtx {
public:
    UsesCtx() { std::cout << "Constructed using singleton " << n << std::endl; }
};  

有没有办法让我的班级UsesCtx同时使用类模板参数和int模板参数?当然,我总是可以用UsesCtx<Ctx64>实例化,所以这不重要。但它并不认为这很难做到。

0 个答案:

没有答案