gpt4 book ai didi

C++11 检查两组可变参数模板参数是否匹配

转载 作者:行者123 更新时间:2023-12-02 08:20:49 25 4
gpt4 key购买 nike

这个问题与我之前提出的关于在 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。

我想做的事情是否可行,如果可行,任何人都可以提供任何指示吗?

最佳答案

(再次)使用 all_true bool pack trick来自哥伦布:

template <bool...> struct bool_pack;
template <bool... v>
using all_true = std::is_same<bool_pack<true, v...>, bool_pack<v..., true>>;

template <class... Args>
struct Signal {
template <class... Dargs, class = typename std::enable_if<all_true<
std::is_same<Args, typename std::decay<Dargs>::type>{}...
>{}>::type>
void broadcast(Dargs &&...) {}
};

如果参数不完全匹配,这个 SFINAE 就会失去这个功能。

关于C++11 检查两组可变参数模板参数是否匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37454987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com