C++ 传递模板以供以后在其他结构/类上下文中使用

C++ 传递模板以供以后在其他结构/类上下文中使用,c++,using,C++,Using,我有一些类需要定义一个模板,该模板可以在以后作为类型用于泛型代码部分 在现实世界的代码中,转发的模板有很多参数,阅读代码并不是很好 问:是否可以用一些语法来定义模板,而不是像下面的示例中那样将其编写为别名模板?我很简单,可以避免在每个别名声明中重复两次所有模板参数 现实世界中的模板也有一些非类型模板参数,因此简单地使用将不起作用 例如: #include <iostream> template < typename T> struct A { static vo

我有一些类需要定义一个模板,该模板可以在以后作为类型用于泛型代码部分

在现实世界的代码中,转发的模板有很多参数,阅读代码并不是很好

问:是否可以用一些语法来定义模板,而不是像下面的示例中那样将其编写为别名模板?我很简单,可以避免在每个别名声明中重复两次所有模板参数

现实世界中的模板也有一些非类型模板参数,因此简单地使用
将不起作用

例如:

#include <iostream>

template < typename T>
struct A
{
    static void Do(T t) { std::cout << "A " << t << std::endl;}
};

template < typename T>
struct B
{
    static void Do(T t) { std::cout << "B " << t << std::endl;}
};

struct UseA
{
    // using the alias template works as expected, but...
    template < typename T>
        using USE = A<T>;

    // is there any chance to write something like:
    // using USE = A; 
    // to simply avoid replication of template parameters?
};

struct UseB
{
    template < typename T>
        using USE = B<T>;
};

int main()
{
    UseA::USE<int>::Do(1);
    UseB::USE<std::string>::Do("Hallo");
}
#包括
模板
结构A
{

静态void Do(T){std::cout您所要求的无法完成。您必须始终定义整个类型列表。原因是,对于同一类型,可以有默认重载。例如,在以下
A
中,
A
A
都是有效的。编译器不知道您想要哪一个:

template <class T, int Value = 42>
struct A {};

auto test() {
    auto a = A<int, 3>{};
    auto b = A<int>{};
    auto c = A<>{};
}
模板
结构A{};
自动测试(){
自动a=a{};
自动b=A{};
自动c=A{};
}
如果您不想编写类型列表,我建议您切换到模板化更多的类,这样他们就不需要知道实现细节。例如:

#include <iostream>

template < typename T>
struct A
{
    static void Do(T t) { std::cout << "A " << t << std::endl;}
};

template < typename T>
struct B
{
    static void Do(T t) { std::cout << "B " << t << std::endl;}
};

template < typename T>
struct Use
{
    using USE = T;
};

int main()
{
    Use<A<int>>::USE::Do(1);
    Use<B<std::string>>::USE::Do("Hallo");
}
#包括
模板
结构A
{

静态空隙Do(T){std::cout你能详细说明一下你想要实现的目标吗?这似乎很做作而且不切实际。..。@jan.sende应用程序有数据对象,只需编写
auto x=a+b;
a和b就是这些数据对象。生成的术语数据类型取决于数据类型,但生成器不适用(重载运算符)不应再次专门针对每种数据类型。因此,重载运算符会生成一个数据对象所表示类型的术语对象。在这里显示完整示例非常重要。并且不需要了解我当前的编码问题是什么。因此,我制作了一个看起来有点无用的示例。感谢您的工作“我建议您切换到模板化更多类”。不可能,因为模板的“用户”是重载运算符。我想使用简单语法
auto x=a+b
,这应该是通用代码部分,因此运算符本身应该“知道”根据数据对象a和b生成哪种类型。附加备注:“您必须始终定义整个类型列表。原因是”…我想转发模板,而不是模板实例/类型。这是核心思想。您也可以将模板传递到另一个模板中,稍后创建实例。在我编写使用时,我不想创建实例!实例是在“转发”的位置创建的使用了别名模板。我想我们在某个地方有一个心理断开。我在这里要说的是:我需要一个运算符,它根据参数做正确的事情。例如,
“4”+“2”=“42”
,但
4+2=6
。这就是重载所做的。不需要模板。您可以使用模板使这些运算符更通用,但随后必须对其进行模板化。我猜您随后会遇到模板太宽的问题,但您可以使用SFINEA解决此问题,…此外,您说您希望传递模板,但
>A
不是模板,
A
是!没有
的类型只是普通类型。顺便说一句。我觉得你似乎在试图发明表达式模板。看看:“但是你必须将它们模板化。”抱歉,没有!我所有的代码都按预期工作,唯一的问题是简化别名模板。运算符重载是通用的,不需要为我要使用的每种数据类型专门化它们。这正是该设计的目标:“使运算符代码通用!”因此,操作员只需要别名模板来生成新的“术语”对象。没有专门化和SFINAE,尤其是不向操作员公开术语类型。这最终导致维护噩梦。每个术语类型都有自己的重载/专门化。否!:-)
#include <iostream>

template < int Value >
struct INT
{
    static constexpr int value = Value;
};
template < bool Value >
struct BOOL
{
    static constexpr bool value = Value;
};

template < typename T, typename Value >
struct A
{
    static void Do(T t) { std::cout << "A " << t << Value::value << std::endl;}
};

template < typename T, typename Value>
struct B
{
    static void Do(T t) { if (Value::value) std::cout << "B " << t << std::endl;}
};

template <template<typename...> class T, typename ...Param>
using USE = T<Param...>;

int main()
{
    USE<A, int, INT<42>>::Do(1);
    USE<B, std::string, BOOL<true>>::Do("Hallo");
}