Templates 使用已经实现的方法进行c++11部分类专门化

Templates 使用已经实现的方法进行c++11部分类专门化,templates,c++11,partial,specialization,partial-specialization,Templates,C++11,Partial,Specialization,Partial Specialization,关联此示例代码 #include <vector> #include <iostream> #include <algorithm> #include <unistd.h> template< typename T, typename S > class MyClass { public: MyClass () : v(10) {} bool ok () { return true; } T run (S s,

关联此示例代码

#include <vector>
#include <iostream>
#include <algorithm>
#include <unistd.h>

template< typename T, typename S >
class MyClass
{
public:
    MyClass () : v(10) {}
    bool ok () { return true; }
    T run (S s, int i) { return v.at(i) = s(); }

private:
    std::vector<T> v;
};

int main ()
{
    auto f_int = [=]() -> int { sleep(1); return 15; };
    MyClass<int, stdmc::function< int(void) > > mc_int;
    std::cout << mc_int.run(f_int, 1) << std::endl;

    return 0;
}
有没有办法在c++11中实现这种行为?如果是,正确的语法是什么?如果没有,你建议怎么做?复制整个类,同时只更正一个方法,或者完全重新构造整个类,以避免这些问题,也许可以使用vector,它应该能够存储void*?

多亏了-这似乎可行

#include <vector>
#include <iostream>
#include <algorithm>
#include <unistd.h>

class Base
{
public:
    bool ok () { return true; }
};

template< typename T, typename S >
class MyClass : public Base
{
public:
    MyClass () : v(10) {}
    T run (S s, int i) { return v.at(i) = s(); }

private:
    std::vector<T> v;
};

template< typename S >
class MyClass<void, S> : Base
{
public:
    MyClass () = default;
    void run (S s, int i) { return s(); }
};

int main ()
{
    auto f_int = [=]() -> int { sleep(1); return 15; };
    MyClass<int, std::function< int(void) > > mc_int;
    std::cout << mc_int.run(f_int, 1) << std::endl;

    auto f_void = [=]() -> void { sleep(1); std::cout << "done" << std::endl; };
    MyClass<void, std::function< void(void) > > mc_void;
    mc_void.run(f_void, 1);

    return 0;

}

独立于T的部件可以移动到基类MyClassBase中。MyClass将从中继承并使用依赖于T的部分对其进行扩展。
#include <vector>
#include <iostream>
#include <algorithm>
#include <unistd.h>

class Base
{
public:
    bool ok () { return true; }
};

template< typename T, typename S >
class MyClass : public Base
{
public:
    MyClass () : v(10) {}
    T run (S s, int i) { return v.at(i) = s(); }

private:
    std::vector<T> v;
};

template< typename S >
class MyClass<void, S> : Base
{
public:
    MyClass () = default;
    void run (S s, int i) { return s(); }
};

int main ()
{
    auto f_int = [=]() -> int { sleep(1); return 15; };
    MyClass<int, std::function< int(void) > > mc_int;
    std::cout << mc_int.run(f_int, 1) << std::endl;

    auto f_void = [=]() -> void { sleep(1); std::cout << "done" << std::endl; };
    MyClass<void, std::function< void(void) > > mc_void;
    mc_void.run(f_void, 1);

    return 0;