对于以下 MWE,是否有一种简单的方法可以将两个模板特化合并为一个,可能使用 std::enable_if
?
#include <string>
#include <list>
#include <memory>
class A {
// ...
};
class B {
// ...
};
template<typename T> class C {};
template<typename T>
class C<std::list<T> &> : public A, public B
{
std::list<T> &l_ref;
public:
C(std::list<T> &lr) : l_ref{lr} { }
// ...
};
template<typename T>
class C<const std::list<T> &> : public A, public B
{
const std::list<T> &l_ref;
public:
C(const std::list<T> &lr) : l_ref{lr} { }
// ...
};
对于惯用语
template<typename T>
struct C<T, typename std::enable_if<
std::is_same<T, std::list<E> &>::value ||
std::is_same<T, const std::list<E> &>::value>::type>
: public A, public B
{
// ...
方式,我认为没有办法使 E
可推导或指定“任何 std::list
”的类型。
最佳答案
您可以先创建一个特征,然后使用 SFINAE,例如:
template <typename T> struct is_a_stdlist_ref : std::false_type {};
template <typename ... Ts>
struct is_a_stdlist_ref<std::list<Ts...>&> : std::true_type {};
template <typename ... Ts>
struct is_a_stdlist_ref<const std::list<Ts...>&> : std::true_type {};
template<typename T, typename Enabler = void> struct C;
template<typename T>
struct C<T, std::enable_if_t<is_a_stdlist_ref<T>::value>>
: public A, public B
{
//...
};
关于c++ - 合并 const 和非常量 std::list 的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44571797/