问题
以下是我面临的一个简化、捏造的示例问题。实际上,我需要一个能够容纳任意数量项目并在需要时返回这些项目的对象。
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;
};
当参数大于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,来定义另一个getArgs
函数当 args == 1 时使用?类似于(这显然是非常错误的):
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
吗? - Davis Herring