Вместо использования шаблонов классов для признаков в C ++ 11 вы можете использовать объявления функций (определение не требуется). Функции можно найти, используя поиск имени в зависимости от аргумента , так что вы можете специализировать черты для вашего класса в том же пространстве имен, где объявлен ваш класс.
Это полностью избавляет от необходимости закрывать пространство имен вашего класса, открывать пространство имен признаков, специализировать черту для вашего класса, используя его полное имя, закрывать пространство имен признаков, заново открывать пространство имен вашего учебный класс. А также устраняет необходимость включать объявление основного шаблона.
Пример:
#include
template struct Type {};
template
void trait_of(Type); // Generic trait version.
namespace N {
struct A;
int trait_of(Type); // Trait specialisation for A.
} // N
int main() {
using trait_of_a = decltype(trait_of(Type{})); // trait_of is found using ADL.
static_assert(std::is_same::value, "");
}
Тип возвращаемого значения функции признака может быть контейнером нескольких типов, например :
template
void more_traits(Type); // Generic trait version. Must be specialized.
namespace N {
struct MoreTraitsOfA {
using type_X = ...;
using type_Y = ...;
};
MoreTraitsOfA more_traits(Type); // Trait specialisation for A.
} // N
using MoreTraits = decltype(more_traits(Type{}));
using type_X = MoreTraits::type_X;
using type_Y = MoreTraits::type_Y;
Добавьте следующее к своему файлу конфигурации
<appender name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net">
<param name="File" value="c:\\ProjectX\\Log\\log.txt"/>
<param name="AppendToFile" value="true"/>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<param name="RollingStyle" value="Date"/>
<param name="DatePattern" value="yyyy.MM.dd"/>
<param name="StaticLogFileName" value="true"/>
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%date [%thread] %-5level %logger - %message%newline"/>
</layout>
</appender>
Использование StaticLogFileName:
<param name="StaticLogFileName" value="true"/>
Для тех, кому интересно, вот решение:
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="C:\\Users\\chris\\Documents\\log_.txt"/>
<param name="RollingStyle" value="Date"/>
<param name="DatePattern" value="_(yyyy.MM.dd-hh_mm_ss)"/>
<param name="StaticLogFileName" value="false"/>
<maximumFileSize value="100KB" />
<appendToFile value="true" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message %stackTrace%newline" />
</layout>
</appender>
и модульный тест, который проверяет это:
[Test]
public void TestLogger()
{
logger.Info("Start Log");
for (int i = 0; i < 2500; i++)
{
logger.Info(i);
}
logger.Info("End Log Log");
}
Это производит следующий вывод:
log_.txt_(2009.02.19-01_16_34)
Едва ли, что я хотел, но лучше, чем, что я имел прежде.