C++ 函数中的条件cv限定符
我想使一个方法有条件地常数。就是我们有C++ 函数中的条件cv限定符,c++,templates,c++11,C++,Templates,C++11,我想使一个方法有条件地常数。就是我们有 template <bool isConst> class A { // stuff }; 或 出现在A的正文中 我的第一个想法是尝试条件类型,但由于显而易见的原因,这不起作用。显而易见的解决方案是专门化: template<bool> struct A { void method() const { std::cout << "const" << std::endl
template <bool isConst>
class A {
// stuff
};
或
出现在A
的正文中
我的第一个想法是尝试条件类型,但由于显而易见的原因,这不起作用。显而易见的解决方案是专门化:
template<bool>
struct A
{
void method() const
{
std::cout << "const" << std::endl;
}
};
template<>
struct A<false>
{
void method()
{
std::cout << "non-const" << std::endl;
}
};
模板
结构A
{
void方法()常量
{
std::cout显而易见的解决方案是专门化:
template<bool>
struct A
{
void method() const
{
std::cout << "const" << std::endl;
}
};
template<>
struct A<false>
{
void method()
{
std::cout << "non-const" << std::endl;
}
};
模板
结构A
{
void方法()常量
{
std::cout编辑:这只是出于兴趣。我不建议在商业产品中实际这样做。如果你正在尝试一些东西,可能是在个人项目中
你可以做的事情,有点老套,是这样的:
template< bool OnlyConst >
class TestClass
{
struct Placeholder {};
public:
template< class T >
typename std::enable_if< OnlyConst && !std::is_same<T, Placeholder>::value, void >::type
MyFunc() const
{ std::cout << "Const version"; }
template< class T >
typename std::enable_if< !OnlyConst && !std::is_same<T, Placeholder>::value, void >::type
MyFunc()
{ std::cout << "Nonconst version"; }
};
模板
类TestClass
{
结构占位符{};
公众:
模板
如果::type,则启用
MyFunc()常量
{std::cout
typename std::enable_如果<!OnlyConst&!std::是相同的::值,void>::type
MyFunc()
{std::coutEDIT:这只是为了兴趣。我不建议在商业产品中实际这样做。如果你正在尝试一些东西,可能是在个人项目中
你可以做的事情,有点老套,是这样的:
template< bool OnlyConst >
class TestClass
{
struct Placeholder {};
public:
template< class T >
typename std::enable_if< OnlyConst && !std::is_same<T, Placeholder>::value, void >::type
MyFunc() const
{ std::cout << "Const version"; }
template< class T >
typename std::enable_if< !OnlyConst && !std::is_same<T, Placeholder>::value, void >::type
MyFunc()
{ std::cout << "Nonconst version"; }
};
模板
类TestClass
{
结构占位符{};
公众:
模板
如果::type,则启用
MyFunc()常量
{std::cout
typename std::enable_如果<!OnlyConst&!std::是相同的::值,void>::type
MyFunc()
{std::cout确切的条件是什么?那个方法是模板结构的一部分吗
?谢谢。我添加了一些说明。确切的条件是什么?那个方法是模板结构的一部分吗
?谢谢。我添加了一些说明。谢谢!我认为专门化是一种方法;我正在寻找一种快速的方法ner(如std::conditional
用于typedef
s)。我认为这可能是唯一的方法。谢谢!我认为专业化是一种方法;我正在寻找一个快速的一行程序(如std::conditional
用于typedef
s)。我想这可能是唯一的方法。简而言之,我不知道。至少对于VS2012,我可以调用为:test.MyFunc()编译器似乎很高兴在std::is_same中使用了T。因此,正如我在回答中所说的,这确实意味着编译器在调用时想要知道T,即使它最终没有任何用处。如果可以以某种方式使用T,那么它可以被推导出,调用方不必指定它。或者我不明白你在说什么g?好的,你的回答很有道理,并且为OP提供了另一个想法,所以+1虽然MyFunc
对我来说仍然有点尴尬:)+1的独创性,但不幸的是,模板化对我来说也有点尴尬。对不起-我一直在试图找到一种可以消除空白的方法。我知道这是一个愚蠢的差事。我不会red有点担心使用或typedef是否会在中派上用场。但是我不认为他们可以做到这一点。无论如何,这是一个有趣的练习。我认为模板typename std::enable_if::type MyFunc()const
会更干净一些。简而言之,我不知道。至少对于VS2012,我可以调用为:test.MyFunc()编译器似乎很高兴在std::is_same中使用了T。因此,正如我在回答中所说的,这确实意味着编译器在调用时想要知道T,即使它最终没有任何用处。如果可以以某种方式使用T,那么它可以被推导出,调用方不必指定它。或者我不明白你在说什么g?好的,你的回答很有道理,并且为OP提供了另一个想法,所以+1虽然MyFunc
对我来说仍然有点尴尬:)+1的独创性,但不幸的是,模板化对我来说也有点尴尬。对不起-我一直在试图找到一种可以消除空白的方法。我知道这是一个愚蠢的差事。我不会red有点担心使用或typedef是否会在中派上用场。但是我认为他们无法做到这一点。无论如何,这是一个有趣的练习。我认为模板typename std::enable_if::type MyFunc()const
会更干净一些。
test.MyFunc<void>(); // even though the void doesn't affect it at all