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:-(但我很想听听你的“小把戏”。