首先,我对这个问题的模糊标题感到抱歉。我不知道如何总结它。
我想要实现的目标如下,我希望能够将不同类型的模板非类型参数传递给同一个类模板,从而产生不同的实例化。像这样的事情:
Foo<1>();
Foo<'1'>(); // different types of object
我认为这是不可能的,因此我被迫做这样的事情
template <typename T, T Val>
struct Foo;
template <int Val>
struct Foo<int, Val>
{};
template <char Val>
struct Foo<char, Val>
{};
//...
Foo<int, 1>();
Foo<char, '1'>();
这样Foo
可以基于第一个模板参数进行专门化。然而,这使我试图在元编程框架中实现的迷你语言的语法变得复杂。有什么技术可以让我区分Foo<1>
from Foo<'1'>
?基本上我想做的是设置一个编译时标志(在枚举中)来指示是否int
or char
已通过,但没有明确指定。
EDIT答案让我意识到我的问题意味着我实际上需要这些对象的(编译时)实例。我不...
假设标准以某种方式允许我重载类模板,这样Foo<1>
and Foo<'1'>
是不同的类型,并且包含不同的值flag
场地。然后,这些类型本身可以传递给另一个类模板,该模板可以检查它们并用它做有趣的事情,例如:
template <typename FooType>
struct Bar
{
typedef typename If < FooType::flag, int, char >::Type Type;
};
当您不反对显式传递类型时,这一切都很容易做到,但这似乎是多余的......