C++:在其模板化类型中存在命名成员时,在模板化类中提供一个类函数
C++: providing a class function in templated class on existence of named member in its templated type?
我正在尝试执行以下操作:模板化类应提供一些函数,具体取决于模板化的类型是否包含具有给定名称的成员变量。例如,以下伪代码仅在模板化结构/类具有名为"id"的成员时才应提供"printid()":
#include <iostream>
#include <type_traits>
struct A { int id; };
struct B { };
template<typename T>
class foo
{
T myvar;
public:
#if exists T.id (or the alternative: #if exists myvar.id)
printid() { std::cout << "I have element id."; }
#endif
};
int main(){
foo<A> ok;
ok.printid(); // should compile and execute
foo<B> nok;
nok.printid(); // should not compile
return 0;
}
围绕SFINAE,特征,std::enable_if和StackOverflow进行挖掘,我认为这是可以做到的......不知何故。但是我不知何故未能将enable_if与问题"如何检测类中是否存在特定成员变量?"中的以下代码片段结合起来:
template<typename T, typename = void>
struct has_id : std::false_type { };
template<typename T>
struct has_id<T, decltype(std::declval<T>().id, void())> : std::true_type { };
任何帮助表示赞赏。
是的,这是可能的。下面是一个示例:
template<typename T>
class foo
{
T myvar;
public:
template <class _T = T,
class = typename std::enable_if<
!std::is_function<decltype(_T::id)>::value>
::type>
void printid() { std::cout << "I have element id."; }
};
具体来说,请注意我们如何"接受"T
作为_T
,以便不强制对类模板参数进行约束(这将使类本身不可编译)。相反,我们正在创建一个新的、独立的模板成员函数,它不会对T
本身强制执行任何内容——它只是"碰巧"将其用作默认参数。这是关键部分。
相关文章:
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 将值传递到另一个类函数在打印时为零
- 类函数返回到另一个类函数返回打印不同的值
- 访问另一个类中的模板化嵌套类函数和对象
- C :基类调用自己的虚拟函数 - 一个反图案
- 是否可以从另一个类对象调用一个类函数而不继承第一个类
- C 如何仅实现多个继承类的一个构造函数
- 作为其他类成员的类:创建一个接受所有数据的构造函数
- 如何将一个类函数设置为另一个类函数
- GDB:在 C++ 中的类函数上创建一个断点
- 修改类中调用另一个类函数的变量
- c++类函数在另一个函数中不能按预期工作
- 为什么当我有两个函数时编译器没有显示错误,一个将采用基类,一个将派生类作为参数
- 如何在另一个类函数中使用类,而不依赖于它在C++中的声明位置
- 如何从另一个类调用一个类中的函数?(C++)
- 在 c++ 中通过指针从另一个类调用类函数
- C++ 类函数作为另一个类函数的参数
- 对于自定义类的一个未定义集,是否有一个默认的散列函数
- 您如何为构造函数采用rvalue的类声明一个变量
- C++将一个类成员传递到另一个类函数中