来自可变参数模板的 shared_ptr 的元组?
Tuple of shared_ptr from variadic template?
以下面的片段为基础:
template<typename Type1, typename Type2>
auto Foo() {
std::tuple<std::shared_ptr<Type1>, std::shared_ptr<Type2>> example;
}
在使用可变参数模板时,我应该如何创建我的共享指针元组?
template<typename... Types>
auto Foo() {
// How to create the tuple?
}
这里有大量与元组和可变参数模板相关的问题。有些人似乎解决了这个问题 (, ),但仍然感觉太复杂了(老实说,答案让我难以理解,但很可能是最简单的方法)。
我的尝试使用了递归模板和 std::tuple_cat
,但这一路上创建了许多“子元组”,这远非理想。
简而言之:是否有解决这个问题的“更简单”或“更直接”的方法?不需要多个函数、递归调用等等的东西,有点像 std::tuple<std::shared_ptr<Types...>>
?
扩展包:
#include <tuple>
#include <memory>
#include <type_traits>
template<typename... Types>
auto Foo() {
using tup = std::tuple<std::shared_ptr<Types>...>;
return tup{};
}
int main() {
auto f = Foo<int,double>();
static_assert( std::is_same_v< std::tuple<std::shared_ptr<int>,std::shared_ptr<double>>,decltype(f)>);
}
为方便起见,您可以使用别名:
#include <tuple>
#include <memory>
#include <type_traits>
template <typename...Types>
using SharedTuple = std::tuple<std::shared_ptr<Types>...>;
int main() {
static_assert( std::is_same_v< std::tuple<std::shared_ptr<int>,std::shared_ptr<double>>,SharedTuple<int,double>>);
}
以下面的片段为基础:
template<typename Type1, typename Type2>
auto Foo() {
std::tuple<std::shared_ptr<Type1>, std::shared_ptr<Type2>> example;
}
在使用可变参数模板时,我应该如何创建我的共享指针元组?
template<typename... Types>
auto Foo() {
// How to create the tuple?
}
这里有大量与元组和可变参数模板相关的问题。有些人似乎解决了这个问题 (
我的尝试使用了递归模板和 std::tuple_cat
,但这一路上创建了许多“子元组”,这远非理想。
简而言之:是否有解决这个问题的“更简单”或“更直接”的方法?不需要多个函数、递归调用等等的东西,有点像 std::tuple<std::shared_ptr<Types...>>
?
扩展包:
#include <tuple>
#include <memory>
#include <type_traits>
template<typename... Types>
auto Foo() {
using tup = std::tuple<std::shared_ptr<Types>...>;
return tup{};
}
int main() {
auto f = Foo<int,double>();
static_assert( std::is_same_v< std::tuple<std::shared_ptr<int>,std::shared_ptr<double>>,decltype(f)>);
}
为方便起见,您可以使用别名:
#include <tuple>
#include <memory>
#include <type_traits>
template <typename...Types>
using SharedTuple = std::tuple<std::shared_ptr<Types>...>;
int main() {
static_assert( std::is_same_v< std::tuple<std::shared_ptr<int>,std::shared_ptr<double>>,SharedTuple<int,double>>);
}