繁体   English   中英

C ++模板特化/重载

[英]C++ template specialization/overloading

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

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

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>Foo<'1'> 基本上我想要做的是设置一个编译时标志(在枚举中)以指示传递intchar ,而不显式指定它们。

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

假设标准允许我以某种方式重载类模板,使得Foo<1>Foo<'1'>是不同的类型,并且包含其flag字段的不同值。 然后可以将这些类型传递给另一个类模板,该模板可以检查它们并使用它做有趣的事情,例如:

template <typename FooType>
struct Bar
{
    typedef typename If < FooType::flag, int, char >::Type Type;
};

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

你可以使用宏:

#define MAKE_FOO(value) \
    Foo<decltype(value), value>()

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

如果您只需要在编译时可用的值,但实际上并不需要它们作为类型的一部分,(如果您不需要Foo<int, 1>Foo<int, 2>则不同那么你可以使用constexpr构造函数和constexpr函数在编译时产生Foo实例。

#define DECLTYPE_AUTO(expr) \
  -> decltype(expr) { return expr; }

template <typename T>
struct Foo {

  constexpr Foo(T t) : value(t) {}

  T value;

};  // Foo

template <typename T>
constexpr auto MakeFoo(T val)
    DECLTYPE_AUTO(Foo<T>(val));

static_assert(MakeFoo(2).value == 2, "");
static_assert(MakeFoo('1').value == '1', "");

int main() {}

你可以这样做:

template <int Val>
struct Foo<int, Val> 
{
    static MyEnum tag = myTag1;
};


template <char Val>
struct Foo<char, Val>
{
    static MyEnum tag = myTag2;
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM