是否为每个模板实例化生成唯一的类型或id?(观察者模式示例)
Generate a unique type or id for each template instantiation? ( example observer pattern )
有没有一种方法或技术可以在编译时为每个模板实例化生成唯一的类型或id?
例如,这种观察者模式:
#include <set>
#include <iostream>
template <typename T>
struct type2type {}; // maybe int2type
template<class T, class T_UNIQUE>
struct OBSERVER_BASE
{
virtual void notify ( T, type2type< T_UNIQUE > ) = 0;
};
template<class T, class T_UNIQUE>
struct SUBJECT_BASE
{
// This i like to do without the T_UNIQUE parameter
typedef T_UNIQUE unique_type;
std::set< OBSERVER_BASE< T, unique_type >* > my_observer{};
void do_notify ()
{
for ( auto obs : my_observer )
obs->notify ( T{}, type2type< unique_type >{} );
}
};
class X {};
class Y {};
// manual unique required?
class Subject_A : public SUBJECT_BASE< X, Subject_A > {};
class Subject_B : public SUBJECT_BASE< X, Subject_B > {};
class Subject_C : public SUBJECT_BASE< Y, Subject_C > {};
// typedef UNIQUE_. only to illustrate the idea
typedef typename Subject_A::unique_type UNIQUE_A;
typedef typename Subject_B::unique_type UNIQUE_B;
typedef typename Subject_C::unique_type UNIQUE_C;
class Observer :
public OBSERVER_BASE< X, UNIQUE_A >,
public OBSERVER_BASE< X, UNIQUE_B >,
public OBSERVER_BASE< Y, UNIQUE_C >
{
virtual void notify ( X, type2type< UNIQUE_A > ) override
{
std::cout << "x from Subject_A" << std::endl;
}
virtual void notify ( X, type2type< UNIQUE_B > ) override
{
std::cout << "x from Subject_B" << std::endl;
}
virtual void notify ( Y, type2type< UNIQUE_C > ) override
{
std::cout << "y from Subject_C" << std::endl;
}
};
int main ( int argc, char **argv )
{
Subject_A sub_a {};
Subject_B sub_b {};
Subject_C sub_c {};
Observer obs {};
sub_a.my_observer.insert( &obs );
sub_b.my_observer.insert( &obs );
sub_c.my_observer.insert( &obs );
sub_a.do_notify();
sub_b.do_notify();
sub_c.do_notify();
}
有没有一种方法可以用这种风格(没有手动的唯一参数)来实现它?我知道这听起来很奇怪。。。
template<class T>
struct SUBJECT_BASE
{
typedef AUTOMATIC_UNIQUE_TYPE__OR__WHAT_EVER unique_type;
};
class Subject_A : public SUBJECT_BASE< X > {};
class Subject_B : public SUBJECT_BASE< X > {};
class Subject_C : public SUBJECT_BASE< Y > {};
我不认为有办法实现你的要求,但有可能实现你似乎想要的。此实现不需要手动UNIQUE_TYPE
:
template<class T>
class Subject
{
std::vector<std::function<void(T)>> observers;
public:
void do_notify () {
for ( auto& obs : observers )
obs( T{} );
}
void add_listener(std::function<void(T)> l) {
observers.emplace_back(std::move(l));
}
};
class X {};
class Y {};
int main ()
{
Subject<X> sub_a {};
Subject<X> sub_b {};
Subject<Y> sub_c {};
sub_a.add_listener([](X){std::cout << "x from Subject_A" << std::endl;});
sub_b.add_listener([](X){std::cout << "x from Subject_B" << std::endl;});
sub_c.add_listener([](Y){std::cout << "y from Subject_C" << std::endl;});
sub_a.do_notify();
sub_b.do_notify();
sub_c.do_notify();
}
但它比你发布的代码要少得多。(住在Coliru)
相关文章:
- 通过组合不同的类型来创建唯一的id
- C++需要所有声明的类型说明符和预期的非限定 id(需要调试帮助)
- 使用类型id运算符的最佳替代方法
- 类型名称 T::类型::值中的预期非限定 id
- 堆栈分配的类类型.为什么两个 ID 实例的地址相同?
- 为什么'typeid(x) == typeid(y)'的计算结果为 true,其中 'x' 和 'y' 分别是 T 和 T& 类型的 id-表达式?
- 类型ID,如何仅获取类型名称
- 类型的替代id生成器
- 自动初始值设定项类型ID 信息
- 类型ID指针和引用比较差异?
- gcc 发出了与解析新表达式中的类型 ID 相关的错误
- 我可以从静态基方法获取当前类类型 ID 吗?
- 关于C++中的类型id函数
- 解析问题:预期的不合格的ID和语义问题:C 需要所有声明的类型说明符
- 当OwningThread表示线程ID时,它为什么是HANDLE类型的CRITICAL_SECTION的成员
- reinterpret_cast<类型ID>"type-id"可以是变量吗?
- 我想看到一个在整个后缀表达式的上下文中查找转换类型 id 的示例
- QVariant用户类型()id
- 每种类型的编译时类型ID
- 作为宏参数的安装类型返回错误:字符串常量之前的预期非限定 id