我有
class ClassA {};
class ClassB {};
auto func_a() -> ClassA {
return ClassA(); // example implementation for illustration. in reality can be different. does not match the form of func_b
}
auto func_b() -> ClassB {
return ClassB(); // example implementation for illustration. in reality can be different. does not match the form of func_a
}
我希望能够使用语法
func<ClassA>() // instead of func_a()
func<ClassB>() // instead of func_b()
(这是更大模板的一部分)
但我不知道如何实现函数别名的模板专门化。 帮助?这个的语法是什么?
[编辑]到目前为止发布的答案没有回答我的问题,因此我将编辑我的问题以使其更加清晰。
func_a 和 func_b 的实际定义比“return Type();”更复杂。而且它们也不能被触摸。因此,将它们视为
auto func_a() -> ClassA {
// unknown implementation. returns ClassA somehow
}
auto func_b() -> ClassB {
// unknown implementation. returns ClassB somehow
}
我无法模板化 func_a 或 func_b 的内容。我需要 func
最佳答案
你可能会做类似(c++17)的事情:
template <typename T>
auto func()
{
if constexpr (std::is_same_v<T, ClassA>) {
return func_a();
} else {
return func_b();
}
}
C++17 之前版本的替代方法是标记分派(dispatch)(允许自定义点):
// Utility class to allow to "pass" Type.
template <typename T> struct Tag{};
// Possibly in namespace details
auto func(Tag<ClassA>) { return func_a(); }
auto func(Tag<ClassB>) { return func_b(); }
template <typename T>
auto func() { return func(Tag<T>{}); }
关于C++ 专用函数模板别名语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70421369/