在编译时选择容器类型
Selecting container type at compile time
我想 select 在编译时使用一个模板参数的标准容器之一。像
template<typename T>
void foo()
{
using Container = std::conditional_t< std::is_same_v<T, int>,
std::vector, // T is int
std::set>; // any other T
Container<T> bar;
}
如何正确执行此操作?
在不知道你的问题中“正确”的确切含义的情况下,你可能想要的是以下内容:
template<typename T>
void foo()
{
using Container = std::conditional_t<
std::is_same<T, int>::value,
std::vector<T>, // T is int
std::set<T>>; // any other T
Container bar;
}
您的原始代码无效,因为
std::conditional_t
需要类型作为第二和第三个参数,但您指定了 class 模板。
- C++14中没有
std::is_same_v
,到了C++17。您需要改用 std::is_same<X,Y>::value
。
完整代码here.
最简单的方法似乎是
using Container = std::conditional_t< std::is_same_v<T, int>,
std::vector<T>, // T is int
std::set<T>>;
Container bar;
std::conditional_t
允许您 select 一个 类型 。没有允许 select 一个 模板 的标准条件模板。想写一个也可以,但是这个用起来不方便
template <bool t, template <typename...> typename X, template <typename...> typename Y>
struct conditional_template;
template <template <typename...> typename X, template <typename...> typename Y>
struct conditional_template<true, X, Y>
{
template <typename... ts> using type = X<ts...>;
};
template <template <typename...> typename X, template <typename...> typename Y>
struct conditional_template<false, X, Y>
{
template <typename... ts> using type = Y<ts...>;
};
template <typename... ts>
using Container = conditional_template<true, std::list, std::vector>::type<ts...>;
Container<int> x;
似乎无法定义 std::conditional_t
便利别名的类似物。
std::conditional_t
的解决方案可能没问题(并且已在其他答案中修复),但恕我直言,最好在这里使用更原始的东西:简单的老式模板专业化:
template<typename T>
void foo()
{
using Container = std::set<T>;
Container<T> bar;
someCode(bar);
}
template<>
void foo<int>()
{
using Container = std::vector<T>;
Container<T> bar;
someOtherCode(bar);
}
我想 select 在编译时使用一个模板参数的标准容器之一。像
template<typename T>
void foo()
{
using Container = std::conditional_t< std::is_same_v<T, int>,
std::vector, // T is int
std::set>; // any other T
Container<T> bar;
}
如何正确执行此操作?
在不知道你的问题中“正确”的确切含义的情况下,你可能想要的是以下内容:
template<typename T>
void foo()
{
using Container = std::conditional_t<
std::is_same<T, int>::value,
std::vector<T>, // T is int
std::set<T>>; // any other T
Container bar;
}
您的原始代码无效,因为
std::conditional_t
需要类型作为第二和第三个参数,但您指定了 class 模板。- C++14中没有
std::is_same_v
,到了C++17。您需要改用std::is_same<X,Y>::value
。
完整代码here.
最简单的方法似乎是
using Container = std::conditional_t< std::is_same_v<T, int>,
std::vector<T>, // T is int
std::set<T>>;
Container bar;
std::conditional_t
允许您 select 一个 类型 。没有允许 select 一个 模板 的标准条件模板。想写一个也可以,但是这个用起来不方便
template <bool t, template <typename...> typename X, template <typename...> typename Y>
struct conditional_template;
template <template <typename...> typename X, template <typename...> typename Y>
struct conditional_template<true, X, Y>
{
template <typename... ts> using type = X<ts...>;
};
template <template <typename...> typename X, template <typename...> typename Y>
struct conditional_template<false, X, Y>
{
template <typename... ts> using type = Y<ts...>;
};
template <typename... ts>
using Container = conditional_template<true, std::list, std::vector>::type<ts...>;
Container<int> x;
似乎无法定义 std::conditional_t
便利别名的类似物。
std::conditional_t
的解决方案可能没问题(并且已在其他答案中修复),但恕我直言,最好在这里使用更原始的东西:简单的老式模板专业化:
template<typename T>
void foo()
{
using Container = std::set<T>;
Container<T> bar;
someCode(bar);
}
template<>
void foo<int>()
{
using Container = std::vector<T>;
Container<T> bar;
someOtherCode(bar);
}