是否可以编写一个模板来改变行为,具体取决于是否在类上定义了某个成员函数?
这是我想写的一个简单例子:
template<class T>
std::string optionalToString(T* obj)
{
if (FUNCTION_EXISTS(T->toString))
return obj->toString();
else
return "toString not defined";
}
Run Code Online (Sandbox Code Playgroud)
所以,如果class T已经toString()确定的话,就使用它; 否则,它没有.我不知道怎么做的神奇部分是"FUNCTION_EXISTS"部分.
这是我正在尝试做的事情:
template <typename T> struct Model
{
vector<T> vertices ;
#if T has a .normal member
void transform( Matrix m )
{
each vertex in vertices
{
vertex.pos = m * vertex.pos ;
vertex.normal = m * vertex.normal ;
}
}
#endif
#if T has NO .normal member
void transform( Matrix m )
{
each vertex in vertices
{
vertex.pos = m * vertex.pos ;
}
}
#endif
} ;
Run Code Online (Sandbox Code Playgroud)
我已经看过使用的例子enable_if,但是我无法理解如何应用enable_if这个问题,或者甚至可以应用它.
我有一个模板,我想根据参数的类型有条件地编译.我只关心区分"普通旧数据"(POD),即整数等,或类/结构.我在Windows上使用c ++ VS2008.
template<T>
class foo
{
void bar(T do_something){
#if IS_POD<T>
do something for simple types
#else
do something for classes/structs
#endif
}}
Run Code Online (Sandbox Code Playgroud)
我一直在看升级库,我可以看到它们似乎有我想要的东西.但是,我不明白该#if语句的正确语法是什么.
任何帮助,将不胜感激.
编辑---在阅读回复后,我发现在我对问题的定义中忽略了一些内容.Class foo是一个模板化的类,只需要实例化的版本bar是正确的class type T.我一直在寻找一个可以在编译时解决的解决方案.希望这能解决我的问题.