相关疑难解决方法(0)

使用SFINAE进行模板类专业化

假设我有这些声明

template<typename T> class User;
template<typename T> class Data;
Run Code Online (Sandbox Code Playgroud)

并且想要实现User<>for T = Data<some_type> 和派生的任何类,Data<some_type>但也允许在别处定义的其他特化.

如果我还没有类模板的声明User<>,我可以简单地说

template<typename T,
         typename A= typename std::enable_if<is_Data<T>::value>::type>
class User { /*...*/ };
Run Code Online (Sandbox Code Playgroud)

哪里

template<template<typename> data>> struct is_Data
{ static const bool value = /* some magic here (not the question) */; };
Run Code Online (Sandbox Code Playgroud)

但是,这有两个模板参数,因此与前一个声明冲突,其中User<>声明只有一个模板参数.还有什么我可以做的吗?

(注意

template<typename T,
         typename A= typename std::enable_if<is_Data<T>::value>::type>
class User<T> { /*...*/ };
Run Code Online (Sandbox Code Playgroud)

不起作用(默认模板参数可能不在部分特化中使用),也不起作用

template<typename T> class User<Data<T>> { /*...*/ };
Run Code Online (Sandbox Code Playgroud)

因为它不允许从中派生类型Data<>,也不允许 …

c++ templates sfinae c++11

37
推荐指数
3
解决办法
1万
查看次数

将 std::hash 专门化为派生类

我有一个抽象基Hashable类,可以对其进行散列派生。我现在想扩展std::hash到所有从Hashable.

下面的代码应该完全做到这一点。

#include <functional>
#include <type_traits>
#include <iostream>

class Hashable {
public:
    virtual ~Hashable() {}
    virtual std::size_t Hash() const =0;
};

class Derived : public Hashable {
public:
    std::size_t Hash() const {
        return 0;
    }
};

// Specialization of std::hash to operate on Hashable or any class derived from
// Hashable.
namespace std {
template<class C>
struct hash {
  typename std::enable_if<std::is_base_of<Hashable, C>::value, std::size_t>::type
  operator()(const C& object) const {
    return object.Hash();
  }
};
}

int …
Run Code Online (Sandbox Code Playgroud)

hash gcc template-specialization c++11 stdhash

7
推荐指数
1
解决办法
2079
查看次数

标签 统计

c++11 ×2

c++ ×1

gcc ×1

hash ×1

sfinae ×1

stdhash ×1

template-specialization ×1

templates ×1