相关疑难解决方法(0)

是否可以编写模板来检查函数的存在?

是否可以编写一个模板来改变行为,具体取决于是否在类上定义了某个成员函数?

这是我想写的一个简单例子:

template<class T>
std::string optionalToString(T* obj)
{
    if (FUNCTION_EXISTS(T->toString))
        return obj->toString();
    else
        return "toString not defined";
}
Run Code Online (Sandbox Code Playgroud)

所以,如果class T已经toString()确定的话,就使用它; 否则,它没有.我不知道怎么做的神奇部分是"FUNCTION_EXISTS"部分.

c++ templates sfinae template-meta-programming

458
推荐指数
20
解决办法
14万
查看次数

Java中是否有goto语句?

我对此感到困惑.我们大多数人都被告知Java中没有任何goto语句.

但我发现它是Java中的关键词之一.哪里可以使用?如果它不能使用,那么为什么它作为关键字包含在Java中呢?

java syntax goto keyword

252
推荐指数
13
解决办法
38万
查看次数

Perl的隐藏功能?

Perl中有哪些非常有用但却深奥的语言功能,你实际上可以用来做有用的工作?

指南:

  • 尝试限制Perl核心的答案,而不是CPAN
  • 请举例和简短说明

其他语言的隐藏功能隐藏功能:

(这些都来自Corion的回答)

  • C
    • 达夫的装置
    • 便携性和标准性
  • C#
    • 用于以空格分隔的列表和字符串的引号
    • 可替换的命名空间
  • Java的
    • 静态初始化剂
  • JavaScript的
    • 职能是一等公民
    • 阻止范围和关闭
    • 通过变量间接调用方法和访问器
  • 红宝石
    • 通过代码定义方法
  • PHP
    • 普遍的在线文档
    • 魔术方法
    • 符号引用
  • 蟒蛇
    • 一行值交换
    • 能够使用您自己的功能替换核心功能

其他隐藏的功能:

运营商:

引用结构:

语法和名称:

模块,Pragma和命令行选项:

变量:

perl hidden-features

143
推荐指数
39
解决办法
6万
查看次数

在C++中,如果throw是一个表达式,它的类型是什么?

我在我的一个简短的尝试中选择了这个来reddit:

http://www.smallshire.org.uk/sufficientlysmall/2009/07/31/in-c-throw-is-an-expression/

基本上,作者指出在C++中:

throw "error"
Run Code Online (Sandbox Code Playgroud)

是一种表达.这在C++标准中实际上非常清楚地阐明了,包括主文本和语法.但是,至少对我来说不清楚的是表达的类型是什么?我猜到了" void",但是有点尝试使用g ++ 4.4.0和Comeau产生了这样的代码:

    void f() {
    }

    struct S {};

    int main() {
        int x = 1;
        const char * p1 = x == 1 ? "foo" : throw S();  // 1
        const char * p2 = x == 1 ? "foo" : f();        // 2
    }
Run Code Online (Sandbox Code Playgroud)

编译器对// 1没有问题,但在// 2上进行了禁止,因为条件运算符中的类型不同.所以throw表达式的类型似乎不是空的.

那是什么?

如果您回答,请使用标准中的引号备份您的陈述.


事实证明,抛出表达式的类型并不像条件运算符如何处理throw表达式那样 - 这在今天之前我当然不知道.感谢所有回复的人,尤其是David Thornley.

c++ throw

115
推荐指数
3
解决办法
5464
查看次数

C++模板Turing-complete?

我被告知C++中的模板系统在编译时是图灵完备的.这篇文章以及维基百科都提到了这一点.

你能提供一个利用这个属性的计算的重要例子吗?

这个事实在实践中有用吗?

c++ templates turing-complete template-meta-programming

100
推荐指数
9
解决办法
3万
查看次数

Bash的隐藏功能

Shell脚本通常用作粘合剂,用于自动化和简单的一次性任务.您最喜欢的Bash shell /脚本语言的"隐藏"功能有哪些?

  • 每个答案一个功能
  • 举一个示例和该功能的简短描述,而不仅仅是文档的链接
  • 使用粗体标题作为第一行标记要素

也可以看看:

bash shell scripting hidden-features

72
推荐指数
23
解决办法
4万
查看次数

编译器在这里做了什么:int a = b*(c*d*+ e)?

我的程序中有一个奇怪的错误,经过几个小时的调试后,我发现了以下非常愚蠢的行:

int a = b * (c * d *  + e)
Run Code Online (Sandbox Code Playgroud)

如果你没有看到它:在de我之间写的* +,只是一个+意图.

为什么这会编译,它实际上意味着什么?

c++ arithmetic-expressions

72
推荐指数
5
解决办法
7760
查看次数

模板约束C++

在C#中,我们可以定义一个泛型类型,它对可用作泛型参数的类型施加约束.以下示例说明了泛型约束的用法:

interface IFoo
{
}


class Foo<T> where T : IFoo
{
}

class Bar : IFoo
{
}

class Simpson
{
}

class Program
{
    static void Main(string[] args)
    {
        Foo<Bar> a = new Foo<Bar>();
        Foo<Simpson> b = new Foo<Simpson>(); // error CS0309
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法可以在C++中对模板参数施加约束.


C++ 0x本身支持这个,但我说的是当前的标准C++.

c++ templates constraints

62
推荐指数
6
解决办法
4万
查看次数

在`typeid`代码中奇怪地使用`?:`

在我正在研究的其中一个项目中,我看到了这段代码

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

struct ClassX {
  bool isHoldingDerivedObj() const {
    return typeid(1 ? *m_basePtr : *m_basePtr) == typeid(Derived);
  }
  Base *m_basePtr;
};
Run Code Online (Sandbox Code Playgroud)

我从来没有见过这样的typeid用法.为什么它会做那种奇怪的舞蹈?:,而不仅仅是做typeid(*m_basePtr)?有什么理由吗?Base是一个多态类(带有虚拟析构函数).

编辑:在这个代码的另一个地方,我看到这个,它似乎是等价的"多余的"

template<typename T> T &nonnull(T &t) { return t; }

struct ClassY {
  bool isHoldingDerivedObj() const {
    return typeid(nonnull(*m_basePtr)) == typeid(Derived);
  }
  Base *m_basePtr;
};
Run Code Online (Sandbox Code Playgroud)

c++ conditional-operator typeid micro-optimization

60
推荐指数
2
解决办法
1967
查看次数

char数组上一元加运算符的用途是什么?

以下是做什么的?我认为+仅用于整数提升.

char c[20] = "hello";
foo(+c);
foo(+"hello");
Run Code Online (Sandbox Code Playgroud)

c++

38
推荐指数
2
解决办法
6502
查看次数