【发布时间】:2021-08-22 01:10:23
【问题描述】:
问题
以下是我面临的问题的简化、人为示例。本质上,我需要一个可以容纳任意数量的项目并在需要时返回这些项目的对象。
template<typename... Ts>
class Foo {
public:
Foo(Ts... args) :
mArgs{std::forward<Ts>(args)} {
}
std::tuple<Ts...> getArgs() const {
return mArgs;
}
private:
std::tuple<Ts...> mArgs;
};
这在 args > 1 时工作正常。
Foo<int, int> f{1, 2};
auto result = f.getArgs(); // result is a tuple containing two ints.
但是,如果 args == 1,我宁愿不从 getArgs 获取元组。
Foo<int> f{1};
auto result = f.getArgs(); // result is a tuple, but I want it to be an int.
问题
有没有办法,也许使用 SFINAE,来定义另一个在 args == 1 时使用的 getArgs 函数?类似的东西(这显然是非常错误的):
template<typename = std::enable_if_t<std::tuple_size_v<Ts...> == 1>>
??? getArgs() const {
return mArgs;
}
这有几个明显的问题:
- 我不确定
std::tuple_size_v<Ts...>是否会起作用。 - 我不知道新的返回类型是什么。也许
std::tuple_element在这里有用。
【问题讨论】:
-
你是要
std::conditional_t吗?
标签: c++ overloading sfinae return-type variadic