首页
学习
活动
专区
工具
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 <typename...时 , 只进行 简单的 语法分析 , 词法分析 , 生成一个函数头 ; 第二次编译 函数模板 时 , 又生成一个 函数头 ; 这两次编译生成的 函数头 不一致 , 导致 无法找到 相应的 函数实现 ;

20810

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保存一份

    9710

    《逆袭进大厂》第三弹之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.5K10

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

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

    8810

    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成员用带参数的形式调用

    66130

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

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

    3.1K41

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

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

    1.2K40

    C++多态

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

    37010

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

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

    54550

    C++之类和对象

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

    1.2K00

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

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

    36310

    硬核 | C++ 基础大全

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

    1.2K10

    C++和对象 (下篇)

    我们学习了C++的六个默认成员函数,其中构造函数用于对对象进行初始化,即在创建对象时,编译器会自动调用构造函数,给对象各个成员变量一个合适的初始值; class Date { public: Date...static 关键字,只是声明; 静态成员变量的访问受域与访问限定符的约束; 接下来我们围绕这三点特性来展开说明: 1、由于静态成员变量静态区 (数据段) 开辟空间,并不在对象里面,所以它不属于单个对象...C++,我们使用 cin 和 cout 配合流插入 >> 与流提取 << 符号来完成数据的输入输出,并且它们能自动识别内置类型; 那么它们是如何做到输入与输出数据以及自动识别内置类型的呢?...但是重载为全局函数又会出现一个新的问题 – 外部无法访问的私有数据;但是我们又不可能将的私有数据改为共有,这样代价太大了,那么有没有一种办法可以外直接访问的私有成员呢?...; 一个函数可以是多个的友元函数; 友元函数的调用与普通函数的调用原理相同; 3、友元 C++除了有友元函数,还有友元 – 友元的所有成员函数都是另一个的友元函数,都可以访问另一个的私有成员

    48100

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

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

    5.7K10
    领券