C++ 专用函数模板别名语法

标签 c++

我有

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/

相关文章:

c++ - 打开文件,用不同的名字保存拷贝

c++ - 等同于 "typename",表示从属名称确实是 'template template parameter'

c++ - Internet Explorer 控件不会加载 CSS 和 JS

c++ - 使用 TCHAR 时出错,无法转换为 wchar_t

c++ - 无法将 RInside 作为引用传递

c++ - C/C++ 读写长字符串到文件

c++ - 如何在 libqglviewer 中进行动态场景更新

c++ - 简单的 netbeans C++ 项目无法编译

c++ - 在从动态库加载的函数中使用 OpenMP 的棘手错误

c# - 在 C# 中使用 C++ dll