为可变模板的每个参数调用模板函数

问题描述 投票:0回答:1

我正在尝试使用专门的模板功能制作简单的DI,如下所示:

#include <iostream>
template<typename T>
T inject();

template<>
int inject() {
    std::cout << "injected int" << std::endl;
    return 123;
}

class Test {
public:
    Test(int arg) {
        std::cout << arg << std::endl;
    }
};

template<typename C, typename... Args>
C* instantiate() {
    return new C(inject<Args>()...);
}

int main() {
    auto test = instantiate<Test>();
    return 0;
}

显然,它不起作用。是否可以像这样扣除可变参数Args并为每个变量调用instantiate,然后将结果传递给给定类型C的构造函数?

c++ variadic-templates
1个回答
0
投票

您的方法没什么特别的:

template<typename T>
auto inject( ) 
{
    std::cout << __PRETTY_FUNCTION__ << std::endl;
    return T();
}

class Test {
    public:
        template < typename ... T>
        Test(T ... arg)
        {
            std::cout << __PRETTY_FUNCTION__ << std::endl;
        }
};

    template<typename C, typename... Args>
C* instantiate(Args ... args)
{
    return new C(inject<Args>()...);
}

int main()
{
    auto test = instantiate<Test>(1,"Hallo", 2.2);
    return 0;
}

您的给定代码只有一些小语法问题,因为您没有从inject返回任何值,仅提供了一个int参数。如果使用可变参数模板启用所有代码,则可以通过注入传递所有类型的参数,并使用您的C函数的返回类型创建inject的实例。

以上代码输出:

auto inject() [with T = int]
auto inject() [with T = const char*]
auto inject() [with T = double]
Test::Test(T ...) [with T = {int, const char*, double}]
© www.soinside.com 2019 - 2024. All rights reserved.