【发布时间】:2016-05-26 08:03:58
【问题描述】:
这个问题与我之前提出的关于在 C++11 中实现类似于 Qt 的信号/插槽的问题有关。
考虑以下(非常简化的信号调度器,在此示例中没有任何用处,只是为了演示模式/问题):
template< typename... TYPES >
class Signal
{
public:
Signal() = default;
~Signal() = default;
template< typename... PARAMETERS >
void broadcast( PARAMETERS &&... p )
{
// static_assert to confirm PARAMETERS can map to TYPES
}
};
这很好用,但在实践中会发生一些不需要的类型转换。例如;
// acceptable use.
Signal< int, unsigned, float, char >().broadcast( 1, 2u, 0.f, 'a' );
// should fail compilation, first parameter is a float, 4th is an int.
Signal< int, unsigned, float, char >().broadcast( 0.f, 0, 0.f, 0 );
// acceptable use, first parameter is const, but it's convertible.
const int i = 3;
Signal< int, unsigned, float, char >().broadcast( i, 2u, 0.f, 'a');
// acceptable use, first parameter is const &, but it's convertible.
const int & j = i;
Signal< int, unsigned, float, char >().broadcast( j, 2u, 0.f, 'a');
不应该有静默的 float 到 int 的转换。在这种情况下应该可以转换 const/const & (TYPES 的格式不应该有 const 或 & 因为所有数据都应该按值传递)。
我想阻止发生这种不需要的类型转换的编译。我想将 TYPES 和 PARAMETERS 都包装在元组中,遍历元组并确认给定元组参数索引中的每种类型都匹配(包括使用std::decay),但后来我在编译时看不到这样做的方法时间以便它可以进入static_assert。
作为参考,选择的编译器是 clang(OS X 7.3 上的最新版本 (clang-703.0.31))和 vc14。
我想做的事情是否可行,如果可以,任何人都可以提供任何指示吗?
【问题讨论】:
标签: c++11 variadic-templates type-safety