小编avi*_*ad1的帖子

使用 SFINAE 检查 C++ 中的模板父类

我最近一直在 C++ 中学习 SFINAE 的概念,我目前正在尝试在一个项目中使用它。

问题是,我正在尝试做的事情与我能找到的任何事情都不一样,而且我不知道该怎么做。

假设我有一个名为 MyParent 的模板类:

template <typename Elem>
class MyParent;
Run Code Online (Sandbox Code Playgroud)

还有一个名为 MyClass 的非模板类,它继承了它,使用 char 作为 Elem:

class MyClass : public MyParent<char>;
Run Code Online (Sandbox Code Playgroud)

现在,我想使用 SFINAE 来检查 typename 是否继承MyParent,无论使用什么Elem类型。

我不能使用std::is_base_of,因为父母的模板。

我尝试执行以下操作:

template <typename T>
struct is_my_parent : std::false_type {};
template <typename Elem>
struct is_my_parent<MyParent<Elem>> : std::true_type {};
Run Code Online (Sandbox Code Playgroud)

现在,如果我检查is_my_parent<MyParent<Elem>>::value,它会给我true。哪个好。但是,当我检查时is_my_parent<MyClass>::value,我收到了false。哪种有意义,因为MyClass实际上不是MyParent<Elem>,但我没有设法得到我想要的。

除了is_my_parent为每个继承自的类定义之外,有没有什么方便的方法可以在 C++ 中实现这样的事情MyParent

c++ inheritance templates sfinae

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

函数参数地址之间的差异是否总是4个字节?

我一直在用C做一些指针测试,但我只是想知道一个函数的参数地址之间是否总是相差4个字节。

我尝试运行以下代码:

#include <stdio.h>

void func(long a, long b);

int main(void)
{
    func(1, 2);

    getchar();
    return 0;
}

void func(long a, long b)
{
    printf("%d\n", (int)&b - (int)&a);
}
Run Code Online (Sandbox Code Playgroud)

这段代码似乎总是显示4,无论func的参数是什么类型。我只是想知道它是否始终为4,因为如果这样,它将对我尝试做的事情很有用(但是如果不一定是4,我想我可以将va_list用于函数或其他东西)。因此:是否一定是4个字节?

c parameters pointers function

3
推荐指数
1
解决办法
109
查看次数

标签 统计

c ×1

c++ ×1

function ×1

inheritance ×1

parameters ×1

pointers ×1

sfinae ×1

templates ×1