假设我有一个带有类型模板参数包的类模板,如
template<typename... types>class Foo {};
template<typename... types>
class Foo {};
字符串有没有办法在Foo中定义方法,比如void bar(T x);,在参数包types中为每个类型T定义重载?
void bar(T x);
types
wr98u20j1#
你可以让Foo用void bar(T x)继承每个基:
Foo
void bar(T x)
template<typename T>struct FooBase { void bar(T x);};template<typename... types>struct Foo : FooBase<types>... { using FooBase<types>::bar...;};
template<typename T>
struct FooBase {
};
struct Foo : FooBase<types>... {
using FooBase<types>::bar...;
字符串
nwnhqdif2#
你可以只使用一个模板bar:
bar
template<typename... types>struct Foo{ template <class T> void bar(T x) { }};
struct Foo
{
template <class T>
}
字符串如果你只想限制types中的一个,那么你可以使用std::same_as概念:
std::same_as
template<typename... types>struct Foo{ template <class T> requires (... || std::same_as<T, types>) void bar(T x) { }};
requires (... || std::same_as<T, types>)
型但这将不接受可转换为types之一的参数(但不是其中之一)。所以你可以使用std::convertible_to来代替:
std::convertible_to
template<typename... types>struct Foo{ template <class T> requires (... || std::convertible_to<T, types>) void bar(T x) { }};
requires (... || std::convertible_to<T, types>)
型这仍然与实际的非模板化重载有一点不同,因为它不会生成“模糊重载错误”(如果您关心的话)。
2条答案
按热度按时间wr98u20j1#
你可以让
Foo
用void bar(T x)
继承每个基:字符串
nwnhqdif2#
你可以只使用一个模板
bar
:字符串
如果你只想限制
types
中的一个,那么你可以使用std::same_as
概念:型
但这将不接受可转换为
types
之一的参数(但不是其中之一)。所以你可以使用std::convertible_to
来代替:型
这仍然与实际的非模板化重载有一点不同,因为它不会生成“模糊重载错误”(如果您关心的话)。