<T> 仅为具有运算符/定义的此类 T 创建模板
Creating an template<T> only for such T that have operator/ defined
我想为类型定义一个template<T>
,但我必须确保只有定义了operator/
和operator+
的类型才能作为T
传递。
这是因为我希望能够获得其中两个(相同类型)的插值,例如:
template<class T>
class Key final : public KeyBase{
public: //to keep the example simple
//unsigned timeMS; <-- iherited from KeyBase
T value;
public:
Key(unsigned timeMS, const T &value)
: KeyBase(timeMS), value(value){}
T inline getValue(){ return value; }
};
Key<float> start = {10, 5.0f};
Key<float> end = {15, 3.0f};
float ratioAtTime12 = 12 / (end.timeMS - start.timeMS);
float valueAtTime12 = start.value + (end.value - start.value) * ratio;
//Point2D is my own custom type that have operator+, - and / defined
Key<Point2D> start2 = {10, Point2D(10, 15)};
Key<Point2D> end2 = {15, Point2D(111, 6)};
...
Key<Character> start3 = {10, Character("Alan")}; //SHOULD generate an error
//because my custom Character type has no operator+, - or / defined!
对于简单的类型,如float
,int
等,这是可以的。但是,如果复杂类型没有定义operator/
和operator+
,如何防止使用T
复杂类型?
如果你想要一个很好的错误消息,不包括通过 ADL 等找到的几十个运算符,你可以定义特征:
template <typename, typename=void>
struct isAddable : std::false_type {};
template <typename T>
struct isAddable<T, decltype(void(std::declval<T>() + std::declval<T>()))>
: std::true_type {};
template <typename, typename=void>
struct isDividable : std::false_type {};
template <typename T>
struct isDividable<T, decltype(void(std::declval<T>() / std::declval<T>()))>
: std::true_type {};
。并使用静态断言。
static_assert( isAddable<T>{} && isDividable<T>{}, "Invalid T!" );
或者,要获取更具体的信息,请执行以下操作:
static_assert( isAddable<T>{}, "T not addable!" );
static_assert( isDividable<T>{}, "T not dividable!" );
演示。
您还可以使用方便的宏来定义此类特征。
#define VAL std::declval<T>()
#define DEF_TRAIT(name, expression)
template <typename, typename=void> struct name : std::false_type {};
template <typename T>
struct name<T, decltype(void(expression))> : std::true_type {};
DEF_TRAIT(isDividable, VAL / VAL)
DEF_TRAIT(isAddable, VAL + VAL)
演示。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- #为""定义宏;静态";针对不同的上下文
- 如何确保C++函数在定义之前声明(如override关键字)
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在命名空间中定义函数还是限定函数
- 此代码是否违反一个定义规则
- 编译C++时未定义的引用
- 不同翻译单元中不可重载的非内联函数定义
- 为什么在定义函数之前先声明它
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- vscode g++链路故障:体系结构x86_64的未定义符号
- 如何定义一个纯抽象基类