小编Otr*_*gal的帖子

为什么SFINAE(enable_if)从类内部定义而不是外部工作

在过去的几个小时里,我一直在努力解决非常奇怪的问题(在我刚接触SFINAE并解决了5-6个其他问题之后)。基本上,在以下代码中,我希望可以f()处理所有可能的模板实例化,但是g()仅在N == 2以下情况下可用:

#include <type_traits>
#include <iostream>

template<typename T, int N>
class A
{
public:
    void f(void);
    void g(void);
};

template<typename T, int N>
inline void A<T, N>::f()
{
    std::cout << "f()\n";
}

template<typename T, int N, typename std::enable_if<N == 2, void>::type* = nullptr>
inline void A<T, N>::g()
{
    std::cout << "g()\n";
}

int main(int argc, char *argv[])
{
    A<float, 2> obj;
    obj.f();
    obj.g();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试对其进行编译时,我得到一个关于3个模板参数而不是2个模板参数的错误。然后,经过一番尝试,我决定将g()内部的定义移到其A自身的定义内,如下所示:

#include <type_traits> …
Run Code Online (Sandbox Code Playgroud)

c++ templates partial-specialization sfinae enable-if

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

函数指针 - 为什么,当我没有时?

免责声明:我已经阅读了关于这个主题的无数其他文章,但我仍然没有得到它们.示例:为什么这样做:

void func(int a, void (*callback)(int))
{
    /* do something with a and callback */
    callback(3);
}

void pointme(int b)
{
    /* do something with b */
}

int main()
{
    void (*pf)(int);
    pf = &pointme;
    func(10, pf);
}
Run Code Online (Sandbox Code Playgroud)

当我可以简单地这样做:

void func(int a)
{
    pointme(3);
    /* do something with a*/
}

void pointme(int b)
{
    /* do something with b */
}

int main()
{
    func(10);
}
Run Code Online (Sandbox Code Playgroud)

??? 我真的不明白.任何帮助都会受到超级赞赏.谢谢!!!

c c++ pointers function

4
推荐指数
1
解决办法
380
查看次数