为模板化成员函数设置别名

问题描述 投票:0回答:1

我在类中有以下成员函数

class cls {
...
    template <class T>
    bool func(...) {
        // Do something depending on <T>
    }
...
}

我想将

func
更改为私有,而只有
func
公开的相关实例,例如像这样的

class cls {
...
private:
    template <class T>
    bool func(...) {
        // Do something depending on <T>
    }
...
public:
    func_foo = func<FOO>;
    func_bar = func<BAR>;
...
}

所以我可以做

cls c;
...
c.func_foo(...);

我知道我可以做类似的事情

bool func_bar(...) {
    return func<BAR>(...);
}

但这有点难看,想知道是否有更好的方法来做到这一点

c++ templates
1个回答
-1
投票

创建一个概念:

template <typename T, typename... U>
concept is_any_of = (std::same_as<T, U> || ...);

template <is_any_of<Foo, Bar, Baz> T> 
bool func() {
    // Do something depending on <T>
}

现在

T
仅限于
Foo
Bar
Baz

这可以使用旧版本 C++ 中的 SFINAE 或

static_assert
来完成。

您现在将其称为

foo<Bar>
,并且只允许您提供的列表。

如果您需要私有访问其他类型(即只能使用

int
公开调用,但可以使用
double
私下调用),则编写两个版本(一个公共和一个私有),
requires
公共的,并让它调用私人的。

© www.soinside.com 2019 - 2024. All rights reserved.