对于我正在处理的代码,我有一个使用“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>
实例化,所以这不重要。但它并不认为这很难做到。