【问题标题】:Creating null pointers from c++11 template parameter pack从 c++11 模板参数包创建空指针
【发布时间】:2011-10-26 11:48:30
【问题描述】:

我正在做一些元编程,现在我需要测试给定类型的成员函数是否可以使用给定的一组参数调用,所以我正在做类似以下的事情(通过删除所有内容大大简化了当然对于这个特定问题并不重要):

template<typename T, typename... Args>
struct argument_tester {
    struct base: public T { 
        using T::my_member; 
        no my_member(...){}
    };
    typedef decltype(static_cast<base*>(0)->my_member(*static_cast<Args*...>(0))) type;
    //verify return type
};

当然它不适用于*static_cast&lt;Args*...&gt;(0),所以我的问题是是否有任何方法可以将参数包解压缩为取消引用的空指针,或者如果这是我必须专门针对每个参数数量的情况。当然,如果有办法我会怎么做?我正在使用gcc 4.6,以防万一这对可能和不可能产生影响。

【问题讨论】:

  • 你知道std::declval吗?
  • @R。 Martinho Fernandes:我没有,但这对这种情况有什么影响
  • 有一个错误,我认为,在这段代码中,base 未被使用,我认为它是用来代替T 中的static_cast&lt;T*&gt;(0)
  • @Grizzly:不多,但您不需要使用静态强制转换和取消引用空指针。只是让人们了解新工具:)
  • 使用std::declval 使代码更加简洁(对于一个),并且使您能够将T&amp; 指定为参数。目前,如果参数参数之一是T&amp;,那么T&amp;* 将失败...

标签: c++ templates metaprogramming c++11


【解决方案1】:

... unpack "operator" 可以放在表达式之外,在这种情况下,表达式会被展开。

因此,我认为解决方案是(*static_cast&lt;Args*&gt;(0))...

编辑:遵循 R. Martinho Fernandes 的提示

typedef decltype(std::declval<base>().my_member(std::declval<Args>()...)) type;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 2015-04-03
    • 1970-01-01
    相关资源
    最近更新 更多