我是具有可变参数的模板函数的新手。受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];
}
}
答案 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
中独立实现和测试。