c++ - 合并 const 和非常量 std::list 的模板特化

标签 c++ templates c++14 template-specialization

对于以下 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/

相关文章:

c++ - 使用 C++ 创建 rw 管道的最佳方法是什么?

c++ - stringstream 和 nullptr 的子类

c++ - 如何在不将代码放入头文件的情况下处理任何迭代器?

c++ - 使用可变参数模板包装 C++ 类以导出到动态语言

c++ - 简单的 std::regex_search() 代码无法使用 Apple clang++ -std=c++14 编译

c++ - 错误 : prototype for ‘XXX’ does not match any in class ‘YYY’

c++ - VST 主机 - 泄漏对象 - Juce/C++

c++ - 哪个是更好的字符串搜索算法? Boyer-Moore 还是 Boyer Moore Horspool?

c++ - 模板函数被定义为已删除

c++ - 在运行时生成可变参数列表