C++中的编译时条件成员函数调用
compile-time conditional member function call in C++
我有一个模板类,某些成员函数只有在模板参数满足某些条件时才有意义。例如,使用std::enable_if<>
我只能为这些情况定义它们,但是我如何有条件地调用它们呢?下面是一个简短的示例
template<class T> class A
{
typename std::enable_if<std::is_floating_point<T>::value>::type a_member();
void another_member()
{
a_member(); // how to restrict this to allowed cases only?
}
};
首先,你不能像这样使用 SFINAE - 模板类型参数需要位于函数上,而不是类上。
完整的解决方案如下所示:
template<class T> class A
{
private:
template <class S>
typename std::enable_if<std::is_floating_point<S>::value>::type a_member() {
std::cout << "Doing something";
}
template <class S>
typename std::enable_if<!std::is_floating_point<S>::value>::type a_member() {
//doing nothing
}
public:
void another_member()
{
a_member<T>();
}
};
int main() {
A<int> AInt;
AInt.another_member();//doesn't print anything
A<float> AFloat;
AFloat.another_member();//prints "Doing something"
}
警告:这是一个完整的、可怕的黑客,我没有尝试过,可能永远不会奏效。
尝试将其添加到类声明中:
typename std::enable_if<std::is_floating_point<T>, int*>::type a_enabled_p() { return 0;};
void another()
{
if((a_enabled_p()+1)==1)
{
//Not enabled
}
else if((a_enabled_p()+1)==sizeof(int))
{
//Is enabled
}
}
这就是为什么这种恐怖可能会起作用。如果它们是浮点型,则谓词的返回值为 int*
。如果是,则没有 typedef,它默认为 int
(我希望)。当你在int*
上加 1 时,你实际上是在加sizeof(int)
。将 1 加到 int 将递增 1。这意味着通过检查加一的值,我们知道。
注意:不要使用它。想出来很有趣,但上面的答案很多很多
多
更好。不要使用这个。请。
相关文章:
- 访问条件类成员的方法不仅在被调用时才编译
- 基于模板的条件类成员
- 在运行时有条件地删除类成员或跳过调用该成员对象的构造函数
- C++成员函数的条件模板类定义
- 使用互斥锁和条件变量作为成员时如何修复"use of deleted function"?
- 使用 SFINAE 有条件地解析分配器成员
- 初始化数据成员取决于构造函数中的条件
- 条件C++类成员定义
- 使用 std::条件根据模板参数选择成员类型
- 模板元图.班级成员的条件存在
- C++ - 检查所有成员变量的条件
- 根据模板参数条件 C++17 创建成员别名
- 根据成员变量的类型是否存在,有条件地定义该变量
- 条件while循环(此社区的新成员)
- 有条件的 constexpr 成员函数
- 将静态 const 成员重新声明为 constexpr 是否会自动使其符合内联条件
- 基于模板类型参数的条件成员签名和实现
- 编写非虚拟条件成员函数安全吗
- C++中的编译时条件成员函数调用
- 条件成员函数执行