【问题标题】:Portable "typeof" of name with external linkage具有外部链接的可移植名称“typeof”
【发布时间】:2014-12-25 18:49:02
【问题描述】:

Dr.Dobb的文章A Portable "typeof" Operator

但是你不能使用类模板从表达式中提取类型,你可以使用函数模板或重载。 (如果表达式是具有外部链接的名称,则可以通过使用模板非类型参数来实现类模板的 typeof,但这不是很有用。)

括号中的粗体句子是否正确?如果是这样,如何使用模板非类型参数来查找具有外部链接的表达式的类型?

【问题讨论】:

  • Here's my "attempt" - 它不起作用,所以我将它作为评论发布。问题是“鸡和蛋”的问题。现在,如果你可以以某种方式推迟类型参数声明,或者你可以拥有template<T* val>,它可以工作。
  • @milleniumbug -- c++ 在专门化之前需要模板声明,这太糟糕了。否则它可以像template<typename T, T* V> struct<V> { typedef T type }; 一样工作。
  • 我不认为 Dr.Dobb 文章的作者认为他可以采用像 @milleniumbug 试图做的那种表达方式,因为那不能解释它的必要性成为外部链接。
  • @qbt937 实际上,外部链接是我尝试尝试的原因,请参阅this answer, with relevant standard quote。虽然这个具体问题是关于 C++11,但据我所知,链接问题在 C++03 中也很重要。

标签: c++ templates c++03


【解决方案1】:

如果不使用sizeof,C++03 中无法实现typeof。最接近有用的替代方法是使用返回所需类型的函数模板来提取类型。

template<typename T>
struct Type
{
};

template<typename T>
Type<T> makeType(T)
{
    return Type<T>();
}


int main()
{
    int i;

    makeType(2 + 2); // Type<int>
    makeType(&i); // Type<int*>
}

以下技术使用 C++03 中的函数模板来提取可在模板参数中使用的任何表达式的类型和值

template<typename T, T value>
struct NonType
{
};


template<typename T>
struct Type
{
    template<T value>
    static NonType<T, value>
        makeNonType()
    {
        return NonType<T, value>();
    }
};

template<typename T>
Type<T> makeType(T)
{
    return Type<T>();
}


#define MAKE_NONTYPE(e) makeType(e).makeNonType<e>()

int i;

int main()
{
    MAKE_NONTYPE(2 + 2); // NonType<int, 4>
    MAKE_NONTYPE(&i); // NonType<int*, i>
}

以下答案显示了该技术的实际用途,用于提取指向成员函数表达式的指针的类型和值: How to allow templated functor work on both member and non-member functions

【讨论】:

  • 您确实得到了NonType&lt;T, v&gt; 类型的表达式,但是由于您没有typeofdecltype,您仍然不能使用它来引用该类型。很抱歉,但我认为这在这里没有用。
  • 它不是typeofdecltype,但它是解决它们适用的部分问题的有用替代方案。
  • @qbt937 ...为了什么?这不是 AFAICS 的解决方法。
【解决方案2】:

它在 C++03 中不起作用——这种方法实际上是荒谬的,我认为作者没有完全考虑过这个想法。

但是,使用隐式模板参数(如为 C++1Z 提议的那样),这实际上可以工作:

template <using typename T, T&> struct infer {using type = T;};

int a;
infer<a>::type // int

这仍然无法检测 a 是否为引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多