Tim*_*Tim 25 templates specialization c++11
假设我有两个班级:Serializable和Printable.
因此,接受所有派生类的简单模板函数Printable可能如下所示:
template <class T, class B = Printable, class = typename std::enable_if<std::is_base_of<B, T>::value>::type>
void print(T value) {
cout << value << endl;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我希望它也接受所有派生类,Serializable而我仍然可以控制函数体,这显然不起作用:
template <class T, class B = Printable, class = typename std::enable_if<std::is_base_of<B, T>::value>::type>
void print(T value) {
cout << value << endl;
}
template <class T, class B = Serializable, class = typename std::enable_if<std::is_base_of<B, T>::value>::type>
void print(T value) {
cout << value << endl;
}
// Error: Redefinition of ...
Run Code Online (Sandbox Code Playgroud)
所以我认为这个问题的其余解决方案是模板特化.
但我只是无法弄清楚,我如何将模板与std::is_base_ofand的组合专门化std::enable_if.
我希望有人愿意帮助我!
Ker*_* SB 22
尝试一个逻辑运算符:
std::enable_if<std::is_base_of<Serializable, T>::value ||
std::is_base_of<Printable, T>::value>::type
Run Code Online (Sandbox Code Playgroud)
您可以轻松编写可变参数模板,如:
is_base_of_any<T, Printable, Serialiable, Googlable, Foobarable>::value
Run Code Online (Sandbox Code Playgroud)
例如:
template <typename T, typename ...> struct is_base_of_any : std::true_type {};
template <typename T, typename Head, typename ...Rest>
struct is_base_of_any<T, Head, Rest...>
: std::integral_constant<bool, std::is_base_of<T, Head>::value ||
is_base_of_any<T, Rest...>::value>
{ };
Run Code Online (Sandbox Code Playgroud)
如果您想要不同的实现:
template <bool...> struct tag_type {};
template <typename T>
void foo(T, tag_type<true, false>) { } // for Printable
template <typename T>
void foo(T, tag_type<false, true>) { } // for Serializable
template <typename T>
void foo(T x)
{
foo(x, tag_type<std::is_base_of<Printable, T>::value,
std::is_base_of<Serializable, T>::value>());
}
Run Code Online (Sandbox Code Playgroud)
最后一次重载("面向用户"的重载)可能应赋予上述内容enable_if,以免创建过多的过载候选.
您也可以template <typename ...Bases>使用以下标记制作可变参数:
tag_type<std::is_base_of<Bases, T>::value...>
Run Code Online (Sandbox Code Playgroud)
Cas*_*sey 21
比Kerrek的答案少一点机器,但我恐怕没有更多的可读性:
template <class T, typename std::enable_if<std::is_base_of<Printable, T>::value>::type* = nullptr>
void print(const T& value) {
std::cout << "printable(" << &value << ")\n";
}
template <class T, typename std::enable_if<std::is_base_of<Serializable, T>::value>::type* = nullptr>
void print(const T& value) {
std::cout << "serializable(" << &value << ")\n";
}
Run Code Online (Sandbox Code Playgroud)
看到它住在ideone.
| 归档时间: |
|
| 查看次数: |
17465 次 |
| 最近记录: |