【问题标题】:Puzzle: To escape the check of typeid谜题:逃避typeid的检查
【发布时间】:2011-05-18 09:56:19
【问题描述】:

我偶然形成了一个很好的面试问题。 :)

template<typename T>
bool foo (T obj)
{
  if(typeid(T) == typeid(obj))
    return false;
  return true;  // <-- execute this
}

您必须以返回true 的方式调用(仅上述)foo()。条件是,

  1. 无法编辑或重载foo()typeid
  2. 不允许特定平台的黑客攻击
  3. 不允许#define

【问题讨论】:

  • 这不是更好地放在codegolf.stackexchange.com吗?
  • 不暗示它是不允许的(没有为此标记它)。喜欢这个问题。只是想知道。
  • @Bart,无论如何,我已经给出了答案。 :)

标签: c++ typeid


【解决方案1】:
#include <cassert>

struct B { virtual ~B() {} };

int main()
{
    struct : B {} x;
    assert(foo<B&>(x));
}

操作是over there

【讨论】:

  • @Alexandre,+1 不错,但我错过了提及运行时多态性部分。我期待不同的答案
  • @iammilind:你期待什么?如果T 已知,typeid(T) 将在编译时解析,如果obj 不是多态的(将使用其静态类型),typeid(obj) 将解析。
  • 你能解释一下吗?
  • @Dante:当然,你不明白哪一部分?
  • @Dante Jiang:typeid 将返回多态类型信息仅当应用于引用类型。如果我将B&amp; 替换为B,那么1)x 将在传递给foo 时被切片,将其变为实际的B,并且2)typeid(obj) 将返回static 如果obj 不是引用类型(在本例中为T),则为obj 类型。
【解决方案2】:
int main ()
{
  typedef char C[1];
  foo<C>(0);  // returns true;
}

请参阅this question 以了解此答案的解释和此问题的根源。

【讨论】:

  • 不错。 oneliner foo&lt;char[1]&gt;(0); 也可以。
  • 我认为foo&lt;char[1]&gt;("abc") 是一种更有用的方式来传达 S.O. 正在发生的事情。读者...一次一个怪癖;-)。
猜你喜欢
  • 2011-06-05
  • 1970-01-01
  • 2021-05-17
  • 2020-11-25
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
  • 2015-05-12
相关资源
最近更新 更多