具有可变参数编译问题的模板函数

时间:2018-04-01 06:45:39

标签: c++ c++11

我是具有可变参数的模板函数的新手。受Codeview文章启发的代码不能在CreateBook()上编译,需要帮助。

我想使用工厂方法和模板创建一个对象。

class AppDelegate: UIResponder, UIApplicationDelegate {

  var window: UIWindow?
  var tabBarController : UITabBarController?


  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    FirebaseApp.configure()
    FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
    setupTabBarController()
    return true
  }

  func setupTabBarController() {
    window = UIWindow()
    window?.makeKeyAndVisible()
    let vc = MainTabBarController()
    let controller = UINavigationController(rootViewController: vc)
    window?.rootViewController = controller
  }

  func resetTabBarController() -> Void {
    let viewControllerAtIndex1 = ...
    let viewControllerAtIndex2 = ...
    let viewControllerAtIndex3 = ...

    tabBarController?.viewControllers = [viewControllerAtIndex1, viewControllerAtIndex2, viewControllerAtIndex3];
  }

}

3 个答案:

答案 0 :(得分:1)

请参阅此代码。你的bar构造函数也应该处理pack参数。

template<class... X>
bar(X... x) :val(x...) {}

答案 1 :(得分:1)

我尝试编译您的代码,我收到类似no matching function for call to 'bar<book>::bar(const char [12], int)'的错误,因此我将T(...)添加到标记为"Don't compile here."的行中,并且它有效!现在代码看起来像这样:

#include <iostream>
#include <string>
#include <algorithm>
#include <utility>

using namespace std;

template<class T>
class bar
{
public:
    template<class... Args>
    static bar<T> CreateBook(Args&&... args)
    {
        return bar<T>(T(std::forward<Args>(args)...)); // Fixed this line.
    }

    T get()
    {
        return val;
    }
private:

    bar(const T& t) :val(t) {}
    T val;

};

struct book
{
    string name;
    int phone;
    book(string s, int t) : name(s), phone(t) {}
};

void print(bar<book> k)
{
    cout << k.get().name << " " << k.get().phone << endl;
}

int main()
{
    bar<book> b = bar<book>::CreateBook("Hello World",91520);

    print(b);

    return 0;
}

答案 2 :(得分:0)

每个问题都可以通过添加一个层来解决。

首先让我们隔离Factory的工作。它应该只做一个任务。 sprintf(formattedOutput, flag ? "%s: %s" : "%s", usernames[client_index].username, buf); Factory类型的基础对象上提供了一个接口。

T

现在让我们在它上面创建一个帮助函数,以帮助我们管理和分配对象。这个template <typename T> class Factory { public: // prefer copy and move, if you have C++11 Factory(Type d) : data(std::move(d)) {} // const getter T get() const { return data; }; // non-const reference getter, for modifications T & get() { return data; }; private: T data; }; 的工作是创建一个对象并将对象移交给管理者,即MakeObject。然后它返回该托管对象的实例。

Factory

现在我们可以独立地将它们中的两个结合起来,以创造出所需的东西。

template<typename Object, typename ... Args>
Factory<Object> MakeObject(Args && ... args)
{
    return Factory<Object>{ Object{ std::forward<Args>(args) ... } };
}

我没有使用#include <iostream> template <typename T> class Factory { public: Factory(Type d) : data(std::move(d)) {} T get() const { return data; }; T & get() { return data; }; private: T data; }; template<typename Object, typename ... Args> Factory<Object> MakeObject(Args && ... args) { return Factory<Object>{ Object{ std::forward<Args>(args) ... } }; } struct book { std::string name; int phone; book(std::string s, int t) : name(s), phone(t) {} }; void print(Factory<book> const & k) { std::cout << "[ Factory ] : " << k.get().name << ", " << k.get().phone << std::endl; } int main() { auto obj = MakeObject<book>("Hello World", 91520); print(obj); return 0; } 函数static,因为目的不明确。如果你真的想使用CreateBook,现在你已经有了解耦代码,它可以在课程static中独立实现和测试。