<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: template class predicate</title>
    <link>https://opennet.dev/openforum/vsluhforumID9/9461.html</link>
    <description>Здравствуйте!&lt;br&gt;Мне нужно создать шаблон класса, в котором в качестве параметра шаблона выступает функция.&lt;br&gt;Например:&lt;br&gt;&lt;br&gt;&#091;code&#093;&lt;br&gt;int f(int i) &#123;return i*i;&#125;&lt;br&gt;&lt;br&gt;template&amp;lt;class T&amp;gt;&lt;br&gt;class A&lt;br&gt;&#123;&lt;br&gt; typedef T int(p*)(int);&lt;br&gt; p func;&lt;br&gt; int x;&lt;br&gt; public:&lt;br&gt;  A() &#123;x = *p(2);&#125;&lt;br&gt;&#125;;&lt;br&gt;&lt;br&gt;A&amp;lt;&amp;f&amp;gt; a&lt;br&gt;&#091;/code&#093;&lt;br&gt;&lt;br&gt;Как это правильно называется и где можно почитать описание?&lt;br&gt;Спасибо.&lt;br&gt;Алексей &lt;br&gt;</description>

<item>
    <title>template class predicate (elvenic)</title>
    <link>https://opennet.dev/openforum/vsluhforumID9/9461.html#3</link>
    <pubDate>Sun, 20 May 2012 04:40:51 GMT</pubDate>
    <description>&amp;gt; Спасибо, хороший пример.&lt;br&gt;&amp;gt; А по-проще, чтобы просто функцию как параметр шаблона класса можно было передать? &lt;br&gt;&lt;br&gt;Хм, оказывается можно и так: &lt;br&gt;&lt;br&gt;&#091;code&#093; &lt;br&gt;#include &amp;lt;iostream&amp;gt;&lt;br&gt;&lt;br&gt;typedef int (*MyFunPtrType)(int);&lt;br&gt;&lt;br&gt;template&amp;lt;MyFunPtrType fptrParam&amp;gt;&lt;br&gt;class A&lt;br&gt;&#123;&lt;br&gt;  int x;&lt;br&gt;  MyFunPtrType fptr;&lt;br&gt;public:&lt;br&gt;  A() : fptr(fptrParam) &#123; x = fptr(2);&#125;&lt;br&gt;  int getX() &#123; return x; &#125;&lt;br&gt;&#125;;&lt;br&gt;&lt;br&gt;&lt;br&gt;int intQuadruple(int i) &#123; return 4 * i; &#125;;&lt;br&gt;&lt;br&gt;int main(int argc, char *argv&#091;&#093;)&lt;br&gt;&#123;&lt;br&gt;  A&amp;lt;intQuadruple&amp;gt; quadrupler;&lt;br&gt;  std::cout &amp;lt;&amp;lt; &quot;quadrupler.getX(): &#091;&quot; &amp;lt;&amp;lt; quadrupler.getX() &amp;lt;&amp;lt; &quot;&#093;&#092;n&quot;;&lt;br&gt;&#125;&lt;br&gt;&#091;/code&#093;&lt;br&gt;&lt;br&gt;Это компилится и печатает:&lt;br&gt;&lt;br&gt;&#091;code&#093;&lt;br&gt;quadrupler.getX(): &#091;8&#093;&lt;br&gt;&#091;/code&#093;&lt;br&gt;&lt;br&gt;Тут надо было догадаться что fptr, который является не типом, а членом класса, нужно инициализировать в конструкторе (A() : fptr(fptrParam) ... ), а значение которым он инициализируется как раз и передается как не-типовий параметр темплейта (template&amp;lt;MyFunPtrType fptrParam&amp;gt;) :)&lt;br&gt;</description>
</item>

<item>
    <title>template class predicate (handler2006)</title>
    <link>https://opennet.dev/openforum/vsluhforumID9/9461.html#2</link>
    <pubDate>Sun, 20 May 2012 03:02:37 GMT</pubDate>
    <description>Спасибо, хороший пример.&lt;br&gt;А по-проще, чтобы просто функцию как параметр шаблона класса можно было передать?&lt;br&gt;</description>
</item>

<item>
    <title>template class predicate (elvenic)</title>
    <link>https://opennet.dev/openforum/vsluhforumID9/9461.html#1</link>
    <pubDate>Sat, 19 May 2012 21:40:01 GMT</pubDate>
    <description>&#091;code&#093; &lt;br&gt;#include &amp;lt;iostream&amp;gt;&lt;br&gt;&lt;br&gt;struct IntSquarer &#123; int operator()(int i) &#123;return i*i;&#125; &#125;;&lt;br&gt;struct IntTripler &#123; int operator()(int i) &#123; return (3 * i); &#125; &#125;;&lt;br&gt;&lt;br&gt;&lt;br&gt;template&amp;lt;typename Functor&amp;gt;&lt;br&gt;class A&lt;br&gt;&#123;&lt;br&gt;  int x;&lt;br&gt;  Functor funct;&lt;br&gt;public:&lt;br&gt;  A() &#123; x = funct(2);&#125;&lt;br&gt;  int getX() &#123; return x; &#125;&lt;br&gt;&#125;;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;int main(int argc, char *argv&#091;&#093;)&lt;br&gt;&#123;&lt;br&gt;  A&amp;lt;IntSquarer&amp;gt; squarer;&lt;br&gt;  std::cout &amp;lt;&amp;lt; &quot;squarer.getX(): &#091;&quot; &amp;lt;&amp;lt; squarer.getX() &amp;lt;&amp;lt; &quot;&#093;&#092;n&quot;;&lt;br&gt;&lt;br&gt;  A&amp;lt;IntTripler&amp;gt; tripler;&lt;br&gt;  std::cout &amp;lt;&amp;lt; &quot;tripler.getX(): &#091;&quot; &amp;lt;&amp;lt; tripler.getX() &amp;lt;&amp;lt; &quot;&#093;&#092;n&quot;;&lt;br&gt;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;&#091;/code&#093; &lt;br&gt;&lt;br&gt;Это компилится и печатает:&lt;br&gt;&lt;br&gt;&#091;code&#093;&lt;br&gt;squarer.getX(): &#091;4&#093;&lt;br&gt;tripler.getX(): &#091;6&#093;&lt;br&gt;&#091;/code&#093;&lt;br&gt;&lt;br&gt;Тут идея в том что вместо простой функции вы создаете функторы - т.е. классы (или в данном примере, struct&apos;ы) с определенным &apos;operator()&apos;; и в коде этого оператора вы пишете то что вы хотели написать в коде простой функции. Поскольку вы определили не просто функцию, а класс, т.е.&apos;тип&apos;, этот тип может быть параметером темплейта, и темплейтный класс может создать об&apos;ект типа этого параметра, и</description>
</item>

</channel>
</rss>
