C++ 模板非类型参数重载

C++ 模板非类型参数重载,c++,templates,C++,Templates,是否可能有两个名称相同但非类型模板参数不同的模板类-从而产生某种非类型模板参数重载机制 template <typename T, typename U, void (T::*F)(U)> void common() { ... } template <typename T, typename U, void (T::*F)(const U &)> void common() { ... } struct Foo { void foo(bool) {} }

是否可能有两个名称相同但非类型模板参数不同的模板类-从而产生某种非类型模板参数重载机制

template <typename T, typename U, void (T::*F)(U)> void common() { ... }
template <typename T, typename U, void (T::*F)(const U &)> void common() { ... }

struct Foo
{
   void foo(bool) {}
}

struct Bar
{
   void bar(const bool &) {}
}

template <typename T, typename U, void (T::*F)(U)> struct Storage 
{
     Storage() { common <T, U, F>(); }
}
template <typename T, typename U, void (T::*F)(const U &)> struct Storage 
{
    Storage() { common <T, U, F>(); }
}

Storage<Foo, bool, &Foo::foo> foo;
Storage<Bar, bool, &Bar::bar> bar;
template void common(){…}
模板void common(){…}
结构Foo
{
void foo(bool){}
}
结构条
{
空条(常数布尔&){}
}
模板结构存储
{
存储(){common();}
}
模板结构存储
{
存储(){common();}
}
储存食品;
储物条;
有这样一种机制的原因是,两者都应该能够使用相同的宏创建

#define STORAGE(T, U, F) Storage<T, U, F> BOOST_PP_CAT(storage, __LINE__);

STORAGE(Foo, bool, &Foo::foo)
STORAGE(Bar, bool, &Bar::bar)
#定义存储(T,U,F)存储提升(存储,行);
存储(Foo、bool和Foo::Foo)
存储(条形、布尔和条形::条形)
谢谢你的意见

编辑

可能有些进一步的输入是有帮助的

我想要实现的是在初始化时运行的方法。我可以提供这样一个方法——或者更好地说是两个重载方法,一个是const ref,另一个是value成员函数指针;但要在初始化时执行它们,我通常会有一个存根类(就像本例中的存储),它在构造函数中调用这个方法(在初始化时也是如此,因为存储宏创建了存根类的实例)

要使用相同的存储宏,我必须为要执行的函数的存根类使用相同的模板非类型“重载”(我必须模板化类,而不是构造函数,这肯定会导致重载,因为不可能显式地声明构造函数模板参数,而且由于模板参数是非类型的,所以我也不能对它们进行推导)

编辑


指向成员函数的指针必须是编译时值(非类型模板参数)因为它将被包装在一个非模板静态方法中,然后可以存储在运行时可用的std::vector中。

还不完全清楚您要解决的问题。如果您只是想让示例正常工作,您可以将“bool”改为“const bool&”。这是否达到了您的目的

template <typename T, typename U, void (T::*F)(U)> void common() {  }

struct Foo
{
    void foo(bool) {}
};

struct Bar
{
    void bar(const bool &) {}
};

template <typename T, typename U, void (T::*F)(U)>
struct Storage 
{
        Storage() { common <T, U, F>(); }
};

Storage<Foo, bool, &Foo::foo> foo;
Storage<Bar, const bool&, &Bar::bar> bar;
template void common(){}
结构Foo
{
void foo(bool){}
};
结构条
{
空条(常数布尔&){}
};
模板
结构存储
{
存储(){common();}
};
储存食品;
储物条;

用函数而不是类来获得更多乐趣;-)你的目标可以通过部分专业化实现,但不是直接实现。那么乐趣在哪里呢?;-)您将如何使用部分专门化来解决这个问题(因为您不能专门化非类型模板参数)。您可以专门化decltype(F)。因此,您可以使用
Storage::Inside
(如果您需要C++03版本,有一些技巧)。如果您只需要构造函数中的函数,不需要将其作为类的模板参数,只需将其作为参数传递给构造函数。Marc Glisse:我们必须支持C++03,因此不需要decltype:-(但我很想听听你的“小把戏”。