提问人:Paul Grinberg 提问时间:8/27/2022 最后编辑:Paul Grinberg 更新时间:8/27/2022 访问量:91
X宏驱动的C++模板类实例化
X-macro driven C++ template class instantiation
问:
我正在尝试实例化一个基于 X-macro 的模板化类。但是,这给了我语法错误。从 x 宏实例化模板化类的正确方法是什么?error: wrong number of template arguments (0, should be 1)
#include <string.h>
#include <iostream>
#define FOO \
X(, aaa) \
X(int, bbb) \
template <class T> class A
{
public:
A(){ std::cout << "Hello From A\n";}
};
class B
{
public:
B() {std::cout << "Hello From B\n";}
};
int main()
{
#define X(a,b) \
if (0 == strlen(#a)) { \
printf("%s is empty\n", #b); \
B b; \
} else { \
printf("%s is NOT empty\n", #b); \
A<a> b; \
}
FOO
#undef X
return 0;
}
答:
1赞
templatetypedef
8/27/2022
#1
这里的问题不在于您的语法错误,而在于 and 的两个分支都被编译,无论是否为空。编译器错误将触发,因为分支将尝试实例化,这是不合法的。if
else
a
else
A<>
要解决此问题,您可以考虑添加一个间接级别。下面是一段修改过的代码,其中类型用于输出正确类型的内容。AHelper
/* By default, use A. */
template <typename... Args> struct AHelper {
using result = A<Args...>;
};
/* But not if there are no arguments. */
template <> struct AHelper<> {
using result = B;
};
int main() {
#define X(a,b) \
AHelper<a>::result b;
FOO
#undef X
}
(最初,我认为这与使用 而不是 一样简单,但在非模板上下文中,编译器应该同时评估 and 分支和相同的编译器错误结果。if constexpr
if
if
else
上一个:C 语言中的泛型类型转换
下一个:迭代和比较不同大小的结构元素
评论
X(, aaa)
A<> b;
What is the correct way...?