我喜欢在模板类中使用本地类来执行"static if"之类的构造.但是我遇到了gcc 4.8不想编译代码的问题.但是4.7.
这个样本:
#include <type_traits>
#include <iostream>
#include <string>
using namespace std;
struct A {
void printA() {
cout << "I am A" << endl;
}
};
struct B {
void printB() {
cout << "I am B" << endl;
}
};
template <typename T>
struct Test {
void print() {
struct IfA {
constexpr IfA(T &value) : value(value) {
}
T &value;
void print() {
value.printA();
}
};
struct IfB {
constexpr IfB(T &value) : value(value) {
} …Run Code Online (Sandbox Code Playgroud) 我正在实现一个泛型类,它对于不同的类型集应该表现不同(不仅适用于不同的离散类型).目标是序列化不同类型的对象以通过自定义协议发送它们(但它是更多的教育任务,而不是实用的东西;我是一个对分布式计算感兴趣的学生).例如,我需要以不同方式发送浮点数和整数.我还想拥有其他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)