首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

c++中如何在编译期检测一个类有没有重载某静态函数?

在 C++ 中,您可以使用 SFINAE(Substitution Failure is not an Error)技术和 std::is_detected 来在编译期检测一个类是否已经重载了某个静态函数。以下是一个示例:

代码语言:cpp
复制
#include<iostream>
#include <type_traits>

template<typename T>
class has_static_func {
    template<typename C>
    static char test(decltype(&C::static_func));
    template<typename C>
    static long test(...);

public:
    enum { value = sizeof(test<T>(0)) == sizeof(char) };
};

class MyClass {
public:
    static void static_func() {
        std::cout << "MyClass::static_func() called"<< std::endl;
    }
};

class MyOtherClass {
public:
    // static void static_func() {
    //     std::cout << "MyOtherClass::static_func() called"<< std::endl;
    // }
};

int main() {
    std::cout << "MyClass has static_func: "<< std::boolalpha<< has_static_func<MyClass>::value<< std::endl;
    std::cout << "MyOtherClass has static_func: "<< std::boolalpha<< has_static_func<MyOtherClass>::value<< std::endl;
    return 0;
}

在这个示例中,我们定义了一个 has_static_func 类模板,它接受一个类型 T 作为模板参数。test 函数尝试使用不同的参数类型调用 C::static_func,并根据结果返回不同的类型。如果 C::static_func 存在且可访问,则返回 char 类型,否则返回 long 类型。value 成员变量根据 test 函数的返回值来确定是否存在 C::static_func

main 函数中,我们使用 has_static_func 类模板来检测 MyClassMyOtherClass 是否有 static_func 静态函数。输出结果为:

代码语言:txt
复制
MyClass has static_func: true
MyOtherClass has static_func: false

这表明 MyClassstatic_func 静态函数,而 MyOtherClass 没有。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C++】泛型编程 ⑩ ( 类模板的运算符重载 - 函数实现 写在类外部的同一个 cpp 代码中 | 类模板 的 外部友元函数二次编译问题 )

将 类模板 函数声明 与 函数实现 分开进行编码 , 有 三种 方式 : 类模板 的 函数声明 与 函数实现 都写在同一个类中 , 也就是没有分开进行编码 ; 类模板 的 函数实现 在 类外部进行 ,...函数声明 和 实现 写在相同的 .cpp 源码文件中 ; 类模板 的 函数实现 在 类外部进行 , 函数声明 和 实现 写在不同的 .h 和 .cpp 源码文件中 ; 上一篇博客 【C++】泛型编程 ⑨...( 类模板的运算符重载 - 函数声明 和 函数实现 写在同一个类中 | 类模板 的 外部友元函数问题 ) 实现了第一种情况 , 类模板 的 函数声明 与 函数实现 都写在同一个类中 , 也就是没有分开进行编码..., 只有在 重载 左移 右移 操作符时 , 才使用 友元函数 ; ( 1 ) 错误示例及分析 - 类模板 的 外部友元函数 二次编译 问题 在 类模板 内部声明 友元函数 , template 一个函数头 ; 第二次编译 函数模板 时 , 又生成一个 函数头 ; 这两次编译生成的 函数头 不一致 , 导致 无法找到 相应的 函数实现 ;

23410

C++面试题

C++ 基础 1. 引用和指针有什么区别? 一般指的是某块内存的地址,通过这个地址,我们可以寻址到这块内存;而引用是一个变量的别名。指针可以为空,引用不能为空。 2....从实现上看,vbtl在构造函数调用后才建立,因而构造函数不可能成为虚函数从实际含义上看,在调用构造函数时还不能确定对象的真实类型(因为子类会调父类的构造函数);而且构造函数的作用是提供初始化,在对象生命期只执行一次...C++引入这个机制是为了让程序在运行时能根据基类的指针或引用来获得该指针或引用所指的对象的实际类型。简单的讲,RTTI是在一个类的虚函数表里面添加了一个新的类型条目。...在C++中,内存区分为5个:堆、栈、自由存储区、全局/静态存储区、常量存储区。new是在自由存储区开辟内存。 在C中,内存区分为堆、栈、全局/静态存储区、常量存储区。malloc是在堆上开辟内存。...如何构造一个类,使得只能在堆上或只能在栈上分配内存? 容易想到将构造函数设为私有。在构造函数私有之后,无法在类外部调用构造函数来构造类对象,只能使用new运算符来建立对象。

1.7K42
  • C++模版的本质

    )->函数重载决议->编译; 函数模板可以在实例化时候进行参数推导,必须知道每个模板的实参,但不必指定每个模板的实参。...这发生在尝试调用函数、取函数模板地址时,和某些其他语境中; 函数模板在进行实例化后会进行函数重载解析, 此时的函数签名不包括返回值(template argument deduction/substitution...); 函数模板实例化过程中,参数推导不匹配所有的模板或者同时存在多个模板实例满足,或者函数重载决议有歧义等,实例化失败; 为了编译函数模板调用,编译器必须在非模板重载、模板重载和模板重载的特化间决定一个无歧义最佳的模板...模板多个实例很有可能会隐式地增加二进制文件的大小等,所以模板在某些情况下有一定代价,一定要在擅长的地方发挥才能; 如何降低门槛,对初学者更友好,如何降低复杂性,这个是C++未来发展重要的方向。...模板本身是图灵完备的,所以可以结合C++其他特性,编译期常量和常量表达式,编译期计算,继承,友元friend等开阔出更多优雅的设计,比如元容器,类型擦除,自省和反射(静态反射和metaclass)等,将来会出现更多优秀的设计

    1.7K30

    【C++修行之道】类和对象(四)运算符重载

    Ptrfunc fp = &OB::func; // 定义成员函数指针fp指向函数func 在C++中,成员函数与普通函数在内存中的表示和存储方式有所不同。...当有多个版本的operator==可用时(如本例中的类内和全局版本),C++会根据一定的规则(如作用域和参数匹配)来选择调用哪一个。...由于d是静态的,它不会在func函数返回后被销毁,因此可以安全地返回它的引用。 在main函数中,调用了func函数并将返回的引用赋值给const Date& ref。...此时用户再在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是类的成员函数。 3....// C++规定:后置++重载时多增加一个int类型的参数,但调用函数时该参数不用传递,编译器自动传递 // 注意:后置++是先使用后+1,因此需要返回+1之前的旧值,故需在实现时需要先将this保存一份

    10110

    《逆袭进大厂》第三弹之C++提高篇79问79答

    若要使派生类为非抽象类,则编译器要求在派生类中,必须对纯虚函数予以重载以实现多态性。同时含有纯虚函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。...C++支持两种多态性:编译时多态性,运行时多态性。  a.编译时多态性:通过重载函数实现  b.运行时多态性:通过虚函数实现。...This指针首先入栈,然后成员函数的参数从右向左进行入栈,最后函数返回地址入栈。 153、你知道静态绑定和动态绑定吗?讲讲? 1) 对象的静态类型:对象在声明时采用的类型。是在编译期确定的。...对象的动态类型可以更改,但是静态类型无法更改。 3) 静态绑定:绑定的是对象的静态类型,某特性(比如函数依赖于对象的静态类型,发生在编译期。...4) 动态绑定:绑定的是对象的动态类型,某特性(比如函数依赖于对象的动态类型,发生在运行期。 154、如何设计一个类计算子类的个数?

    2.2K30

    C++多态的两种形式

    C++中的多态性具体体现在编译和运行两个阶段。编译时多态是静态多态,在编译时就可以确定使用的接口。运行时多态是动态多态,具体引用的接口在运行时才能确定。 ?...静态多态和动态多态的区别其实只是在什么时候将函数实现和函数调用关联起来,是在编译时期还是运行时期,即函数地址是早绑定还是晚绑定的。...如果没有使用虚函数,即没有利用C++多态性,则利用基类指针调用相应函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重写过的函数。...动态多态是通过“继承+虚函数”来实现的,只有在程序运行期间(非编译期)才能判断所引用对象的实际类型,根据其实际类型调用相应的方法。...---- 参考文献 [1]浅谈C++多态 [2]浅谈C++多态性 [3]Effective C++ 中文第三版[M].条款41:了解隐式接口和编译期多态

    4.1K11

    cc++问题集五

    在栈中分配的空间的生命期与这个变量所在的函数和类相关。如果是函数中定义的局部变量,那么它的生命期就是函数被调用时,如果函数运行结束,那么这块内存就会被回收。...它只要有两个作用: 当它与“C”一起连用的时候,如:extern “C” void fun(int a,int b);则告诉编译器在编译fun这个函数时候按着C的规矩去翻译,而不是C++的(这与C++的重载有关...,C++语言支持函数重载,C语言不支持函数重载,函数被C++编译器编译后在库中的名字与C语言的不同) 当extern不与“C”在一起修饰变量或函数时,extern int g_Int,他的作用是声明变量或者函数为外部变量...怎么实现:该类提供了一个静态的公有函数用于创建或者获取它本身的静态私有对象;类定义中含有一个该类的静态私有对象;单例模式的类只提供私有的构造函数,防止多个实例创建。...(1)饿汉 饿汉单例,即在最开始的时候,静态对象就已经创建完成; 设计方法是类中包含一个静态成员指针,该指针指向该类的一个对象,提供一个公有的静态成员方法,返回该对象指针;为了使得对象唯一,还需要将构造函数设为私有

    1.1K30

    CC++常见面试知识点总结附面试真题—-20220326更新

    在C++中应该优先考虑使用智能指针. 9. C++11 中有哪些智能指针?shared_ptr 的引用计数是如何实现的?unique_ptr 的unique 是如何实现的?...const常量加入符号表,以后(仍然在编译期)遇到这个变量会从符号表中查找,所以在C++中是不可能修改到const变量的。...3).c++中的const 和宏定义是有区别的,宏是在预编译期直接进行文本替换,而const发生在编译期,是可以进行类型检查和作用域检查的。 4).c语言中只有enum可以实现真正的常量。...在C++程序中调用被C编译器编译后的函数,为什么要加extern“C”?...C++语言支持函数重载,C语言不支持函数重载,函数被C++编译器编译后在库中的名字与C语言的不同,假设某个函数原型为: void foo(int x, int y); 该函数被C编译器编译后在库中的名字为

    1.6K10

    【C++】————类和对象(下)

    1.2日期类中的两种构造函数 全缺省构造: 这里我们要给大家讲两种类型的构造函数,一种是全缺省构造函数,另一种是拷贝构造函数,这两种函数不清楚是啥的话可以去看这篇博客:构造函数和全缺省构造函数 我怕们先来说全缺省构造函数...++和后置++呢,这个函数如何去写呢,这里我们有一个很妙的写法,就是前置加加正常写,然后后置加加里面加入一个int,构成重载函数: // 前置++ Date& operator++() { *this...这时候我们可以这样去做,在函数定义和对象的声明的后面加上一个const: 像这样。 在 C++中,要调用一个const对象,可以使用const引用或const指针。...这里我们要说的是其实static也可以在类中声明,被定义的成员被称为类的静态成员,我们知道静态成员不是谁所特有的,而是共享的,不属于某个具体的类,存放在静态区 即使声明在类中,我们依然要在外面定义: 类静态成员即可用...B就可以访问A中的私有成员,但是A不可以访问B的私有, 也就是A把B当成朋友了,但是不能说明B把A当成朋友 七、内部类 内部类其实就是在一个类中再去定义一个类: 内部类,内部类是外部类的私有 在一个类中

    9210

    CC++面试常问题集(2)

    6、哪些成员函数不能被继承? C++中,并不是所有的成员函数都能被子类继承,有三类成员函数不能被子类继承,分别是:构造函数(包括拷贝构造)、析构函数、赋值运算符重载函数。...三,赋值运算符重载函数  赋值运算符重载函数也不会被子类继承,只是在子类的赋值运算符重载函数中会调用父类的赋值运算符重载函数。 7、基类的析构函数为什么要用virtual虚析构函数?...C++中基类采用virtual虚析构函数是为了防止内存泄漏 具体地说,如果派生类中申请了内存空间,并在其析构函数中对这些内存空间进行释放。...C++的多态性具体体现在运行和编译两个方面: (1)在程序运行时的多态性通过继承和虚函数来体现; (2)在程序编译时多态性体现在函数和运算符的重载上; 虚函数 使用virtual关键字声明的是虚函数...1、对象的静态类型(static type):就是它在程序中被声明时所采用的类型(或理解为类型指针或引用的字面类型),在编译期确定; 2、对象的动态类型(dynamic type):是指“目前所指对象的类型

    1.2K10

    《挑战30天C++入门极限》C++面向对象编程入门:构造函数与析构函数

    上一个教程我们简单说了关于类的一些基本内容,对于类对象成员的初始化我们始终是建立成员函数然后手工调用该函数对成员进行赋值的,那么在c++中对于类来说有没有更方便的方式能够在对象创建的时候就自动初始化成员变量呢...关于c++类成员的初始化,有专门的构造函数来进行自动操作而无需要手工调用,在正式讲解之前先看看c++对构造函数的一个基本定义。   ...析构函数的定义:析构函数也是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只有在类对象的生命期结束的时候,由系统自动调用。   ...析构函数与构造函数最主要大不同就是在于调用期不同,构造函数可以有参数可以重载!   ...前面我们已经简单的说了类的构造函数和析构函数,我们知道一个类的成员可以是另外一个类的对象,构造函数允许带参数,那么我们可能会想到上面的程序我们可以在类中把Student类中的teacher成员用带参数的形式调用

    66830

    C++内存管理(建议收藏)

    但当你必须要使用new 和delete时,你不得不控制C++中的内存分配。你需要用一个全局的new 和delete来代替系统的内存分配符,并且一个类一个类的重载new 和delete。...任何试图将他对一个普通指针的赋值都会产生一个编译期错误,因为类型不匹配。...比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,但是因为这个类是一个Singleton,所以内存泄漏只会发生一次。...笔者今天在这里并不是要讨论如何避免这些问题,而是想从另外一个角度来认识C++内存对象。 我们知道,C++将内存划分为三个逻辑区域:堆、栈和静态存储区。...第一个问题是class的静态成员对象的生命期,class的静态成员对象随着第一个class object的产生而产生,在整个程序结束时消亡。

    3.3K41

    C++编译期多态与运行期多态

    在面向对象C++编程中,多态是OO三大特性之一,这种多态称为运行期多态,也称为动态多态;在泛型编程中,多态基于template(模板)的具现化与函数的重载解析,这种多态在编译期进行,因此称为编译期多态或静态多态...return 0; } 运行期多态的实现依赖于虚函数机制。当某个类声明了虚函数时,编译器将为该类对象安插一个虚函数表指针,并为该类设置一张唯一的虚函数表,虚函数表中存放的是该类虚函数地址。...以不同的模板参数具现化导致调用不同的函数,这就是所谓的编译期多态。 相比较于运行期多态,实现编译期多态的类之间并不需要成为一个继承体系,它们之间可以没有什么关系,但约束是它们都有相同的隐式接口。...在编译期间,编译器推断出模板参数,因此确定调用的shout是哪个具体类型的接口。不同的推断结果调用不同的函数,这就是编译器多态。这类似于重载函数在编译器进行推导,以确定哪一个函数被调用。...运行期多态与编译期多态优缺点分析 运行期多态优点 OO设计中重要的特性,对客观世界直觉认识。 能够处理同一个继承体系下的异质类集合。 运行期多态缺点 运行期间进行虚函数绑定,提高了程序运行开销。

    1.2K40

    从 Java 和 JavaScript 来学习 Haskell 和 Groovy(类型系统)

    静态类型的语言系统在编译期就明确知道每一个变量的类型,如果发现不合法的类型赋值就在编译期报错;动态类型则直到运行时才会报错。...还有一个注解在编译期类型推断和检查能力更强,是 “CompileStatic”,可以在编译期检查出元类(metaClass)操作带来的类型错误。...在 Java、C++这样的静态语言中,函数只能被声明和调用,只能依附在类的定义上面,无法像对象一样被传来传去,为此还孕育了一堆设计模式,看起来高大上了,其实是无奈为之。...值得一提的还有: 方法重载从编译时到运行时:方法重载的选择在静态语言里面全部都是编译期确定的,编译期认为参数的类型是什么就是什么,这是在编译期间就已经明确的事情(参阅 《画圆画方的故事》,有一个很明确的例子...考虑到 typeclass 本身是一个表示行为的定义,一方面很像接口,另一方面又很像 Java 中的 “重载”,同一个方法接受不同的 type 参数,执行不同的逻辑,而且同样是编译期确定。

    55150

    C++多态

    简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数实现的。 --百度百科 由以上解释大致可以了解到多态的含义。...对于C++来说,多态就是同一个函数不同的执行效果。实现方式就是子类根据自身需要更改了从父类继承的方法。 2. 基本语法 C++支持多种多态,从实现形式上概括,有虚函数、重载等。...从绑定时间,分为静态多态和动态多态,又称为编译期多态和运行期多态。...简单地来讲:静态多态是指在编译后就已经绑定,主要实现形式有函数模板和类方法重载;动态多态是指在运行期间才能确定,主要实现形式为基类的虚函数继承。...,并在构造函数中实现成员初始化。

    37710

    C++之类和对象

    方案三:类中只放成员变量,也不放任何地址,将成员函数放到公共代码段,由编译器去查找 【补充】 有没有想过一个空类的大小是多少?空类的大小是零吗?...如何测试某台机器是大端还是小端,有没有遇到过要考虑大小端的场景 解答:大小端是机器针对非单字节的一种存储方式,大端存储是将数据的高位存储在内存的低地址处,小端存储是将数据的低位存储在内存的低地址处。...+中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问...、函数的复用、对特殊情况的处理等知识) 放在 Date 类的实现中去介绍; 赋值重载 基础知识 **赋值重载函数也是C++默认的六个成员函数中的一个,是运算符重载的一种形式,它的作用是在两个已经存在的函数间赋值...这一特性在《C++ primer》中也有解释: 深浅拷贝 用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。

    1.2K00

    《Effective C++》读书笔记(二):构造析构赋值运算(条款05~条款12)

    对于这六大默认成员函数,详细的解析在类和对象这篇博客中,我将在这里简单的总结一下编译器是如何调用它们的。...对于构造函数和析构函数:对于内置类型,C++中选择不处理,也就是内置类型在构造函数中会是随机值,因此在C++11中,可以在声明的时候顺带定义一下。...还有一种情况是在继承的情况下,基类将自己的赋值重载函数设为私有的,那么编译器就会拒绝给派生类默认生成赋值重载函数。...这样做的好处是,如果有人在类中调用了这些被私有化的函数,或者使用友元,那么会在连接期出现错误,而并非编译期的错误。如果是发生在连接期的错误,这种错误很难侦测出来!...做法就是在派生类中的拷贝构造函数和赋值重载中调用基类的拷贝构造和赋值函数。

    37110

    硬核 | C++ 基础大全

    当我们定义一个派生类对象时,编译器检测该类型有虚函数,所以为这个派生类对象生成一个虚函数指针,指向该类型的虚函数表,这个虚函数指针的初始化是在构造函数中完成的。...析构函数没有参数,也没有返回值,而且不能重载,在一个类中只能有一个析构函数。当撤销对象时,编译器也会自动调用析构函数。...如何检测内存泄漏 首先可以通过观察猜测是否可能发生内存泄漏,Linux 中使用 swap 命令观察还有多少可用的交换空间,在一两分钟内键入该命令三到四次,看看可用的交换区是否在减少。...动态联编与静态联编 在 C++ 中,联编是指一个计算机程序的不同部分彼此关联的过程。...如果析构函数执行不全,就是没有完成他应该执行的每一件事情。 类如何实现只能静态分配和只能动态分配 前者是把 new、delete 运算符重载为 private 属性。

    1.2K10

    QT常见面试题,基础知识偏多

    当我们重载event()函数时, 需要调用父类的event()函数来处理我们不需要处理或是不清楚如何处理的事件. 3) 在Qt对象上安装事件过滤器....答:*编译期:检查信号与槽是否存在,参数类型检查,Q_OBJECT是否存在 *信号可以和普通的函数、类的普通成员函数、lambda函数连接(而不再局限于信号函数和槽函数) *参数可以是 typedef...动态库: 工作中有没有使用过动态库和静态库?能不能简单说下两者的区别? 答:静态库:在链接阶段将汇编生成的目标文件.o与引用库一起链接打包到可执行文件中,可简单看成(.o或者.obj文件的集合)。...虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class)。...C++支持两种多态性:编译时多态性,运行时多态性。 a.编译时多态性:通过重载函数实现 b 运行时多态性:通过虚函数实现。 11.

    5.9K10

    c#面试题抽象类和接口的区别-金三银四面试:C#程序员经常遇到的30道基础面试题,想你所想

    11、C#中有没有静态构造函数,如果有是做什么用的?   12、在C#中如何实现多态?   13、什么是反射?如何实现反射?   14、请解释流与文件有什么不同?   ....;   11、C#中有没有静态构造函数,如果有是做什么用的?   有。静态构造函数用于初始化类。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。...静态构造函数既没有访问修饰符,也没有参数。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。无法直接调用静态构造函数。在程序中,用户无法控制何时执行静态构造函数。   ...静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。   12、在C#中如何实现多态?   ...重写主要是在继承中体现,就是在基类中定义方法并在派生类中使用新实现重写它们。   13、什么是反射?如何实现反射?   反射提供了访问程序集、模块和类型信息的一种机制。

    2K20
    领券