小编mfy*_*fya的帖子

如何用文字0和指针解决对重载函数的调用歧义

我很确定这一定已经在这里了,但是我没有找到很多关于如何解决这类问题的信息(没有在电话上强制转换):

给定两个重载,我希望一个带有文字0的函数的调用总是调用unsigned int版本:

void func( unsigned int ) {
    cout << "unsigned int" << endl;
}

void func( void * ) {
    cout << "void *" << endl;
}

func( 0 ); // error: ambiguous call
Run Code Online (Sandbox Code Playgroud)

我明白为什么会这样,但我不想一直写func(0u)甚至func(static_cast(0)).所以我的问题是:

1)是否有推荐的方法来执行此操作?

2)以下方式进行操作是否有任何问题,这是什么原因?

void func( unsigned int ) {
    cout << "unsigned int" << endl;
}

template <typename T>
void func( T * ) {
    static_assert( std::is_same<T, void>::value, "only void pointers allowed" );
    cout << "void *" << endl;
}

func( 0 ); // …
Run Code Online (Sandbox Code Playgroud)

c++ templates overloading overload-resolution

10
推荐指数
1
解决办法
6546
查看次数

如何使用循环引用来散列和检查对象的相等性

我有一个由Node对象表示的循环图形结构.甲节点可以是一个标量值(叶)或n> = 1的列表的节点(内节点).

由于可能的循环引用,我不能简单地使用递归的HashCode()函数,它结合了所有子节点的HashCode():它最终会进行无限递归.

虽然HashCode()部分似乎至少可以通过标记和忽略已经访问过的节点来实现,但我有一些麻烦要想到Equals()的工作和有效算法.

令我惊讶的是,我没有找到任何有用的信息,但我相信很多聪明的人都想过解决这些问题的好方法......对吗?

示例(python):

A = [ 1, 2, None ]; A[2] = A  
B = [ 1, 2, None ]; B[2] = B
Run Code Online (Sandbox Code Playgroud)

A等于B,因为它代表完全相同的图形.

BTW.这个问题并不针对任何特定的语言,但是在Java中为所描述的Node对象实现hashCode()和equals()将是一个很好的实际例子.

hash graph equals circular-reference cyclic

7
推荐指数
1
解决办法
904
查看次数

IO完成端口数据包何时发送、何时不发送?

我目前正在研究一种基于使用 IO 完成端口的命名管道的 IPC 机制。

不幸的是,我在使用 msdn 文档时遇到了一些麻烦,因为我不清楚在哪种情况下调用 ReadFile/WriteFile 会产生完成数据包。

当 ERROR_IO_PENDING 返回 FALSE 时的情况很清楚,但是当返回 ERROR_MORE_DATA 时明显可能的情况又如何呢?这种情况下会有完成包吗?另外,如果返回其他错误怎么办?在哪些情况下我必须直接处理结果并释放资源,而不是在完成处理程序中?

另一种情况是 ReadFile/WriteFile 甚至成功,这显然也是可能的。值得庆幸的是,MSDN对此非常清楚:

此外,WriteFile 函数有时会返回 TRUE,且 GetLastError 值为 ERROR_SUCCESS,即使它使用的是异步句柄(也可能因 ERROR_IO_PENDING 而返回 FALSE)。...在此示例中,建议允许完成端口例程单独负责此类资源的所有释放操作。

这个建议在所有情况下都是正确的吗?分配给完成端口的句柄的 ReadFile/WriteFile 操作的结果实际上可以(并且应该)完全被忽略,因为数据包无论如何都会发送到端口?

windows winapi named-pipes overlapped-io io-completion-ports

5
推荐指数
1
解决办法
1687
查看次数

使用嵌套类的奇怪enable_if行为(MSVC编译器错误或功能?)

经过一段时间的调试后,我使用enable_if跟踪了出现问题的原因以及一些意外的模板专业化结果:

以下代码使Visual Studio 2010(和2008)在DoTest()中的声明失败,而在g ++ 3.4.5中则没有。但是,当我从SomeClass中删除模板或将my_condition移出SomeClass的范围时,它也可以在MSVC中使用。

这段代码是否有问题(至少部分地)解释了此行为,或者这是MSVC编译器中的错误?

(使用此示例代码,对于boost和c ++ 0x stl版本是相同的)

#include <cassert>
#include <boost\utility\enable_if.hpp>

template <class X>
class SomeClass {
public:
    template <class T>
    struct my_condition {
        static const bool value = true;
    };

    template <class T, class Enable = void> 
    struct enable_if_tester { 
        bool operator()() { return false; }
    };

    template <class T>
    struct enable_if_tester<T, typename boost::enable_if< my_condition<T> >::type> { 
        bool operator()() { return true; }
    };

    template <class T>
    void DoTest() …
Run Code Online (Sandbox Code Playgroud)

c++ templates nested-class visual-studio enable-if

5
推荐指数
1
解决办法
577
查看次数