我認為用例很常見,當您有多個具有共同元素(變數或 fcn)的模板類,并且您想以類似回圈的方式為所有這些類呼叫 fcn 時。
顯然,我們可以定義一個基類并制作一個基類指標串列,并使用它們回圈,但我試圖避免使用指標(用于復制問題)和虛函式(用于優化原因)
template <typename T>
struct A {T _value; void foo(){cout<<_value;}};
A<int> a_1{1}; A<float> a_2{2.0f}; ...
void foo_all(){ a_1.foo(); a_2.foo(); ... }
// for (auto i :{a_1,a_2, ...}) is not possible
// array<A<T>,10>; is not also possible, if T is variable
這個用例是否有某種設計模式/習語是否計劃在將來有一個可迭代的概念容器?
uj5u.com熱心網友回復:
嘗試可變引數模板?
template <typename T, typename... Types>
void callAll(T&& value, Types&&... values) {
value.foo();
if constexpr (sizeof...(values) > 0) {
callAll(values...);
}
}
然后
callAll(a_1, a_2);
演示
如果您使用的是 C 20,則可以使用概念來限制引數型別。
template<typename T>
concept IsA = requires(T x)
{
{ x.foo() };
};
template <typename T, typename... Types>
requires IsA<T>
void callAll(T&& value, Types&&... values)
uj5u.com熱心網友回復:
我通過實作自己的元組(沒有分配)找到了解決方案
template <typename T1, typename... Tn> struct tuple
{
tuple(T1&& first, Tn&&... rest): m_first(first), m_rest(std::forward<Tn>(rest)...){};
T1 m_first; tuple<Tn...> m_rest;
};
template <typename T> struct tuple<T> /*specialization*/
{
tuple(T&& first): m_first(first){};
T m_first;
};
template<class functor,typename... Tn>
void apply(functor&& fcn, tuple<Tn...>& t)
{
fcn(t.m_first);
if constexpr(sizeof...(Tn)>1) apply(std::forward<functor>(fcn), t.m_rest);
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/438906.html
