[英]C++ template specialization/overloading
首先,我很抱歉这个问题含糊不清。 我不确定如何总结它。
我想要实现的是以下内容,我希望能够将不同类型的模板非类型参数传递给同一个类模板,从而产生不同的实例化。 像这样的东西:
Foo<1>();
Foo<'1'>(); // different types of object
我不认为这是可能的,因此我不得不做这样的事情
template <typename T, T Val>
struct Foo;
template <int Val>
struct Foo<int, Val>
{};
template <char Val>
struct Foo<char, Val>
{};
//...
Foo<int, 1>();
Foo<char, '1'>();
这样Foo
可以基于第一个模板参数进行专门化。 然而,这使我试图在我的元编程框架中实现的迷你语言的语法复杂化。 是否有任何技术可以让我区分Foo<1>
和Foo<'1'>
? 基本上我想要做的是设置一个编译时标志(在枚举中)以指示传递int
或char
,而不显式指定它们。
编辑答案让我意识到我的问题暗示我实际上需要(编译时)这些对象的实例。 我不...
假设标准允许我以某种方式重载类模板,使得Foo<1>
和Foo<'1'>
是不同的类型,并且包含其flag
字段的不同值。 然后可以将这些类型传递给另一个类模板,该模板可以检查它们并使用它做有趣的事情,例如:
template <typename FooType>
struct Bar
{
typedef typename If < FooType::flag, int, char >::Type Type;
};
当你没有明确地反对传递类型时,这一切都很容易做到,但这似乎是多余的......
你可以使用宏:
#define MAKE_FOO(value) \
Foo<decltype(value), value>()
实际上,我认为你需要在编译时使用广泛的函数模板make_something
。 不幸的是,我不知道如何实现它。
如果您只需要在编译时可用的值,但实际上并不需要它们作为类型的一部分,(如果您不需要Foo<int, 1>
和Foo<int, 2>
则不同那么你可以使用constexpr
构造函数和constexpr
函数在编译时产生Foo
实例。
#define DECLTYPE_AUTO(expr) \
-> decltype(expr) { return expr; }
template <typename T>
struct Foo {
constexpr Foo(T t) : value(t) {}
T value;
}; // Foo
template <typename T>
constexpr auto MakeFoo(T val)
DECLTYPE_AUTO(Foo<T>(val));
static_assert(MakeFoo(2).value == 2, "");
static_assert(MakeFoo('1').value == '1', "");
int main() {}
你可以这样做:
template <int Val>
struct Foo<int, Val>
{
static MyEnum tag = myTag1;
};
template <char Val>
struct Foo<char, Val>
{
static MyEnum tag = myTag2;
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.