gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:10:29 25 4
gpt4 key购买 nike

我有一些类需要定义一个模板,稍后可以在通用代码部分中用作类型。

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

问:是否可以用某种语法定义模板,而不是像下面的例子那样将其写成别名模板?我只是想避免在每个别名声明中重复所有模板参数两次。

真实世界的模板也有一些非类型模板参数,所以简单地使用 <PARMS...>将不起作用。

例子:

#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<int, 3> , A<int>A<>都是有效的。编译器不知道你想要哪个:

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

auto test() {
auto a = A<int, 3>{};
auto b = A<int>{};
auto 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");
}

或者,为您的非模板类型值使用容器:

#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");
}

关于c++ - 传递模板供以后在其他结构/类上下文中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57922844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com