相关疑难解决方法(0)

C++ 中的预期析构函数

我有这段代码,输出如下:

链接到以下示例 https://godbolt.org/z/z8Pn9GsTv

template <typename T>
struct A1 {
    A1() {
        std::cout << "construction of a1" << std::endl;
    }

    ~A1() {
        std::cout << "destruction of a1" << std::endl;
    }
    ~A1() requires (std::is_same_v<T,int>) {
        std::cout << "it is an int" << std::endl;
    }
};

int main() {
    A1 <int>a;
    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

construction of a1
destruction of a1
Run Code Online (Sandbox Code Playgroud)

但交换析构函数的位置会给出其他结果:

代码链接 https://godbolt.org/z/vxj7dPqaj

template <typename T>
struct A1 {
    A1() {
        std::cout << "construction of a1" << std::endl;
    }

    ~A1() requires (std::is_same_v<T,int>) …
Run Code Online (Sandbox Code Playgroud)

c++ destructor c++20

27
推荐指数
1
解决办法
1119
查看次数

有没有办法将模板化的函数签名作为模板模板参数传递

通过使用模板模板参数,可以将模板化的类传递给类,而无需在其参数上指定类型.我想知道有没有办法将函数的模板化签名传递给模板模板参数,以便能够专门考虑函数的哪个变体被认为是向前的.

要清楚 - 我知道我做不到:

template <class T>
void foo() { /*...*/ }

template <template <class...> class FooType>
struct Foo { /*...*/ };

int main() {
    Foo<decltype(foo)> f;
}
Run Code Online (Sandbox Code Playgroud)

但不知何故,我希望能够将模板的模板签名传递给Foo.它甚至可能吗?

c++ templates

17
推荐指数
2
解决办法
2418
查看次数

C++:部分特化的手动消歧(使用SFINAE)

我正在实现一个泛型类,它对于不同的类型集应该表现不同(不仅适用于不同的离散类型).目标是序列化不同类型的对象以通过自定义协议发送它们(但它是更多的教育任务,而不是实用的东西;我是一个对分布式计算感兴趣的学生).例如,我需要以不同方式发送浮点数和整数.我还想拥有其他POD类型的默认处理程序.但我需要覆盖一些我的POD类型的行为......

我发现SFINAE方法非常有用,并为使用SFINAE原理和部分特化的自定义类型实现了整数和浮点类型的泛型类(参见下面的代码).但是,当我试图实现其他POD类型的处理程序,希望其他处理程序将重叠更一般的POD类型处理程序时,我遇到了歧义问题.实际上,对于POD类型及其子集 - 我的GenericObject类的可能特化没有重叠 - 整数和浮点类型.

我试图实现专业化的手动排序,阅读很多关于部分排序的内容,关于如果专业化更专业的话,优先选择专业化.但我未能解决问题.我不知道如何以手动方式消除我的部分专业化歧义.

排除一组浮点类型和我的POD类型处理程序的整数类型的解决方案对我来说是不可接受的,因为这种方式会在处理程序之间产生过多的依赖关系.我希望有一个正确的方法来解决我的问题.例如,在程序开始时,所有静态资源都使用多个优先级进行初始化.在GCC中,我可以使用属性构造函数来控制这种初始化的顺序:__ attribute __((constructor(101)))或类似的属性init_priority.如果我能以这种方式重新排序模板部分特化,我会很高兴.

你能告诉我什么吗?

这是我的代码:

#include <type_traits>
#include <iostream>
#include <cxxabi.h>

// General form
template <typename T, typename Enable0 = void>
struct GenericObject {
    char * description() {
        return (char *)"Undefined";
    }
};

// Specialization for integral types
template <typename T>
struct GenericObject<T, typename std::enable_if<std::is_integral<T>::value>::type> {
    char * description() {
        return (char *)"Integral";
    }
};

// Specialization for real types
template <typename T>
struct GenericObject<T, typename std::enable_if<std::is_floating_point<T>::value>::type> {
    char * description() {
        return …
Run Code Online (Sandbox Code Playgroud)

c++ templates sfinae template-specialization c++11

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