C++ 为变量模板的每个参数调用模板函数

C++ 为变量模板的每个参数调用模板函数,c++,variadic-templates,C++,Variadic Templates,我正在尝试使用专门的模板函数制作简单的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) {

我正在尝试使用专门的模板函数制作简单的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;
}
#包括
模板
T注入();
模板
int注入(){
std::cout
#包括
#包括
#包括
结构注入{
运算符int()常量{return 123;}
运算符double()常量{return 3.14;}
运算符const char*()const{return“foo”;}
};
模板
使用repeat=T;
模板
C*实例化(std::index_序列){
返回空ptr;
}
模板
自动实例化(std::index\u序列)
->std::如果启用,则启用{
返回新的C((void(Is),注入{})…);
}
模板
自动实例化(std::index\u序列)
->std::如果启用,则启用{
返回实例化(std::index_序列{});
}
模板
C*实例化(){
返回实例化(std::index_序列{});
}

基于您希望推导出的
Args
是什么?基于
C
构造函数的参数类型?给出这样不清楚的问题并在答案下添加越来越多的细节是一个非常糟糕的主意。请提供一个更清楚的问题,而不是通过对答案的评论逐步改变要求!谢谢!这并不是什么新鲜事。所有这些问题都是作为代码示例的一部分在原始问题中指定的。是的,它们必须从C构造函数的参数中推导出来。
#include <type_traits>
#include <utility>
#include <cstddef>

struct injected {
    operator int() const { return 123; }
    operator double() const { return 3.14; }
    operator const char*() const { return "foo"; }
};

template <std::size_t, typename T>
using repeat = T;

template <typename C>
C* instantiate(std::index_sequence<0, 1, 2, 3, 4, 5>) {
    return nullptr;
}

template <typename C, std::size_t... Is>
auto instantiate(std::index_sequence<Is...>)
    -> std::enable_if_t<std::is_constructible<C, repeat<Is, injected>...>{}, C*> {
    return new C((void(Is), injected{})...);
}

template <typename C, std::size_t... Is>
auto instantiate(std::index_sequence<Is...>)
    -> std::enable_if_t<not std::is_constructible<C, repeat<Is, injected>...>{}, C*> {
    return instantiate<C>(std::index_sequence<Is..., sizeof...(Is)>{});
}

template <typename C>
C* instantiate() {
    return instantiate<C>(std::index_sequence<>{});
}