C++模板特化/重载

Jor*_*eit 6 c++ templates specialization non-type

首先,我很抱歉这个问题含糊不清.我不确定如何总结它.

我想要实现的是以下内容,我希望能够将不同类型的模板非类型参数传递给同一个类模板,从而产生不同的实例化.像这样的东西:

Foo<1>();
Foo<'1'>(); // different types of object
Run Code Online (Sandbox Code Playgroud)

我不认为这是可能的,因此我不得不做这样的事情

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'>();
Run Code Online (Sandbox Code Playgroud)

这样Foo可以基于第一模板参数进行专门化.然而,这使我试图在我的元编程框架中实现的迷你语言的语法复杂化.有没有可以让我区分Foo<1>的技术Foo<'1'>?基本上我想要做的是设置一个编译时标志(在枚举中)来指示一个int或多个char传递,而不是明确指定它们.

编辑 答案让我意识到我的问题暗示我实际上需要(编译时)这些对象的实例.我不...

说,不知怎的,标准将允许我重载类模板,以便Foo<1>Foo<'1'>不同类型的,并且包含不同值的flag字段.然后可以将这些类型传递给另一个类模板,该模板可以检查它们并使用它做有趣的事情,例如:

template <typename FooType>
struct Bar
{
    typedef typename If < FooType::flag, int, char >::Type Type;
};
Run Code Online (Sandbox Code Playgroud)

当你没有明确地反对传递类型时,这一切都很容易做到,但这似乎是多余的......

Con*_*tor 2

您可以使用宏:

#define MAKE_FOO(value) \
    Foo<decltype(value), value>()
Run Code Online (Sandbox Code Playgroud)

实际上,我认为您需要make_something在编译时使用广泛的函数模板之类的东西。不幸的是,我不知道如何实现它。