Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
119 views
in Technique[技术] by (71.8m points)

c++ - Can I overload function templates based on properties?

I want to get a common property from different families of classes. For some, I can just use a member, for some I need to call a function. Can I overload template functions in a way so that the compiler chooses the fitting template function based on whether the class has functionA, functionB or member? Currently I get errors because I define the same template function multiple times...

template<class TypeWithFunctionA>
int doSomething(const TypeWithFunctionA & h)
{
  return h.functionA();
}

template<class TypeWithFunctionB>
int doSomething(const TypeWithFunctionB & h)
{
  return h.functionB();
}

template<class TypeWithMember>
int doSomething(const TypeWithMember & h)
{
  return h.member;
}
question from:https://stackoverflow.com/questions/65949894/can-i-overload-function-templates-based-on-properties

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can overload them with SFINAE. e.g.

template<class TypeWithFunctionA>
auto doSomething(const TypeWithFunctionA & h) -> decltype(h.functionA())
{
  return h.functionA();
}

template<class TypeWithFunctionB>
auto doSomething(const TypeWithFunctionB & h) -> decltype(h.functionB())
{
  return h.functionB();
}

template<class TypeWithMember>
auto doSomething(const TypeWithMember & h) -> decltype(h.member)
{
  return h.member;
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...